Мне нужно отфильтровать слова или группы слов из строки через Regex - PullRequest
0 голосов
/ 06 января 2019

Добрый вечер. У меня есть строка вроде «Leicht bewölkt leichter Regen Regen». Мне нужен шаблон регулярных выражений, который соответствует «leicht bewölkt» (два прилагательных), «leichter Regen» (прилагательное и существительное) и «Regen» (существительное). Я узнал, как я могу сопоставить прилагательное "\ b [a-z] [a-z] * \ b", но как я могу сделать это с двумя прилагательными или одним прилагательным и существительным ...? Я немного растерялся. Заранее спасибо.

\ Ъ [а-г] [а-г] * \ Ъ

1 Ответ

0 голосов
/ 07 января 2019

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

\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 )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...