Регулярное выражение Java не распознает символы из других языков как символы слова (т.е. \ w) - PullRequest
6 голосов
/ 09 февраля 2012

Допустим, у меня есть слово: "Айаварав". Выражение \w+ должно охватывать это слово, но буква «ä» разрезает слово пополам. Вместо «Aiavärav» я получаю «Aia». Каково правильное регулярное выражение для слов, которые содержат эти не-буквы?

1 Ответ

13 голосов
/ 09 февраля 2012

Согласно документации , \w соответствует только [a-zA-Z_0-9], если не указан флаг UNICODE_CHARACTER_CLASS:

Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS)

или встраивать (?U) в шаблон:

Pattern.compile("(?U)\\w+")

для любого из которых требуется JDK 1.7 (т. Е. Java 7).

Если у вас нет Java 7, вы можете обобщить \w в Unicode, используя \p{L}(«буква»; например, [a-zA-Z], но не специфично для ASCII) и \p{N} («число»; например, [0-9], но не специфично для ASCII):

Pattern.compile("[\\p{L}_\\p{N}]+")

Но это звучит какМожет быть, вы ищете слова в обычном смысле (в отличие от языка программирования), и вам не нужно поддерживать цифры и подчеркивания?В этом случае вы можете просто использовать \p{L}:

Pattern.compile("\\p{L}+")

(Кстати, фигурные скобки на самом деле необязательны - вы можете написать \pL вместо p{L} и \pN вместо\p{N} - но люди обычно включают их в любом случае, потому что они требуются для многобуквенных категорий, таких как \p{Lu} "прописная буква".)

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