Регулярное выражение, соответствующее одному полному слову, начинающемуся с заглавной буквы, легко получить из вашего текущего регулярного выражения, просто замените первый класс символов его заглавным эквивалентом:
\b[A-Z][a-z]*\b
Теперь нам нужно только объединить два, чтобы соответствовать следующим шаблонам:
- два слова, оба начинаются с строчных букв (два прилагательных)
- два слова, первое из которых начинается со строчной буквы, второе - в верхнем (прилагательное и существительное)
- одно слово, начинающееся с заглавной буквы (существительное)
Мы можем представлять последовательные слова, соединяя их одним пробелом.
Базовым решением будет чередование трех шаблонов, перечисленных выше:
\b[a-z][a-z]*\b \b[a-z][a-z]*\b|\b[a-z][a-z]*\b \b[A-Z][a-z]*\b|\b[A-Z][a-z]*\b
^________two adjectives_______^ ^____one adjective one noun___^ ^__one noun__^
Его можно улучшить несколькими способами:
- Ваше регулярное выражение для единственной полной строчной буквы может быть записано как
\b[a-z]+\b
(+
- это «один или несколько», то есть то же самое, что и единица, а затем «0 или более» *
)
- автоматически существует граница слова между символом
[a-z]
и пробелом, поэтому \b
после слова и перед пробелом и после пробела и перед словом можно удалить, как они всегда будут совпадают, если слово и пробел.
- Вы можете разложить первые два шаблона, так как оба они начинаются со строчного слова, или два последних шаблона, так как оба заканчиваются существительным. Я, однако, думаю, что это снизит читабельность и, следовательно, удобство обслуживания, поэтому я воздержусь
В заключение я бы использовал следующее:
\b[a-z]+ [a-z]+\b|\b[a-z]+ [A-Z][a-z]*\b|\b[A-Z][a-z]*\b
Тестирование на regex101 показывает, что у вас будут проблемы с не-ascii символами (ö
не соответствует [a-z]
и не считается символом слова , , если не установлен флаг UNICODE ).
Для решения проблемы с Unicode вы можете использовать метасимволы \p{Ll}
«строчные буквы любого языка» и \p{Lu}
«прописные буквы любого языка» в сочетании с флагом UNICODE / UNICODE_CHARACTER_CLASS для Java (необходим для \b
для правильной работы) вместо ваших текущих классов персонажей:
\b\p{Ll}+ \p{Ll}+\b|\b\p{Ll}+ \p{Lu}\p{L}*\b|\b\p{Lu}\p{Ll}*\b
( regex101 , java-код на ideone )