#regex
#регулярное выражение
Вопрос:
Я выполняю регулярное выражение, которое обнаруживает меня, когда текст содержит от 5 до 10 слов в верхнем регистре. На данный момент мое регулярное выражение определяет, когда в тексте меньше 5 слов заглавными буквами и когда в нем 5 совпадений. Проблема возникает, когда у вас больше 10, все еще давая совпадение:
Как я могу это решить?
(?:b[A-Z] b.*){5,10}
Ответ №1:
Этот шаблон (?:b[A-Z] b.*){5,10}
соответствует b[A-Z] b
и затем .*
, который будет соответствовать всем, кроме новой строки, поэтому не учитывает прописные слова.
Если вся строка должна содержать от 5 до 10 слов в верхнем регистре с границами слов, вы можете использовать временный жадный токен, повторяющийся 5-10 раз, и использовать отрицательный прогноз, чтобы утверждать, что то, что справа, не является словом в верхнем регистре:
^(?:(?:(?!b[A-Z] b).)*b[A-Z] b){5,10}(?!.*b[A-Z] b)
Демонстрация регулярных выражений
Объяснение
^
Начало строки(?:
Группа без захвата(?:
Группа без захвата(?!b[A-Z] b).
Отрицательный прогноз, подтвердите, что справа нетb[A-Z] b
, затем сопоставьте любой символ, кроме новой строки, используя.
)*
Закройте группу без захвата и повторите 0 разb[A-Z] b
Сопоставьте границу слова, в 1 раз превышающую прописные буквы от А до Я и границу слова
){5,10}
Закройте группу без захвата и повторите 5-10 раз(?!.*b[A-Z] b)
Отрицательный прогноз, утверждение, что справаb[A-Z] b
нет