Найдите, содержит ли текст от 5 до 10 слов, написанных прописными буквами

#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 нет