Регулярное выражение PHP соответствует слову или группе слов всеми заглавными буквами

#php #regex

#php #регулярное выражение

Вопрос:

Как я могу использовать регулярное выражение для сопоставления слова или группы слов, которые написаны всеми заглавными буквами?

Я считаю, что решил проблему наполовину, хотя это может быть неправильный способ.

Я пытаюсь уловить одно слово всеми заглавными буквами, или два или три — в основном, если они идут подряд, я хочу, чтобы они были записаны как группа, а не как каждое слово само по себе.

например:
«С ДНЕМ РОЖДЕНИЯ, ТОММИ» не будет соответствовать и возвращать [0] -> HAPPY, [1] -> BIRTHDAY, [2] -> TOMMY , но всю группу, такую как [0] -> HAPPY BIRTHDAY TOMMY .

Код, который я использую ниже, соответствует «С ДНЕМ РОЖДЕНИЯ» вместе или просто «ТОММИ», но не всему вместе.

 [A-Z]{1,}s[A-Z]{1,}|b[A-Z]{1,}b
  

Ответ №1:

Вы можете использовать регулярное выражение:

 (?=[A-Z])([A-Zs] )
  

Посмотрите на это

Комментарии:

1. Это позволяет использовать завершающий пробел, но это может быть проблемой, а может и не быть.

2. Просто на будущее, чтобы игнорировать пробелы, используйте следующее регулярное выражение: (?=[A-Z])([A-Z] )

Ответ №2:

Я уверен, что полностью понимаю, что вам нужно, но для группировки вы должны использовать круглые скобки (). попробуйте это:

 ([A-Z] )b([A-Z] )b([A-Z] )b
  

Это должно содержать три последовательных слова с заглавными буквами.

Комментарии:

1. Вы не соответствуете пробелу между словами. Граница слова им не соответствует.

2. Нулевая группа всегда является полным совпадением выражения. Для HAPPY BIRTHDAY TOMMY это вернет [0]=> С ДНЕМ РОЖДЕНИЯ, ТОММИ [1]=> С ДНЕМ РОЖДЕНИЯ [2]=> ДЕНЬ РОЖДЕНИЯ [3] => ТОММИ

3. @stema — Глядя на ожидаемый результат в сообщении Райана, границы не должны быть захвачены.

4. Границы вообще не фиксируются. Дело в том, что ваши выражения не будут соответствовать предложению «С ДНЕМ РОЖДЕНИЯ, ТОММИ». На самом деле это никогда ничему не будет соответствовать. Вы проверяете наличие буквы, затем границы слова, но затем снова должна быть буква ==> это невозможно.

Ответ №3:

Если я вас правильно понимаю, это должно сработать /([A-Z]s?) / . Это должно содержать последовательности типа «С ДНЕМ РОЖДЕНИЯ, Томми» в виде набора и «С ДНЕМ РОЖДЕНИЯ, МАЛЬЧИК Томми» в виде двух наборов («С ДНЕМ РОЖДЕНИЯ» и «МАЛЬЧИК»).

Комментарии:

1. Это позволит захватить все заглавные буквы в предложении, смотрите это в Regexr

Ответ №4:

Как насчет этого

 $str = "My test sentence HAPPY BIRTHDAY TOMMY this is lower case an UPPERCASE more lowercase";
if (preg_match_all('/\b(?=[A-Z])[A-Z ] (?=\W)/',$str,$match)) {                      
    var_dump($match[0]);
}
  

результат

массив(2) { [0]=> строка (20) «С ДНЕМ РОЖДЕНИЯ, ТОММИ» 1=> строка (9) «В ВЕРХНЕМ РЕГИСТРЕ» }

Использование заголовка в конце гарантирует, что в конце не будет пробелов, как это могло бы произойти, если используется граница слова, а за ней следует другое слово.

Смотрите это здесь, в Regexr