Регулярное выражение \ p {L} и \ p {N}

107

Я новичок в регулярных выражениях и получил следующее регулярное выражение:

(\p{L}|\p{N}|_|-|\.)*

Я знаю, что означает * и | означает «или», и это \ ускользает.

Но что я не знаю, что \p{L}и \p{N}означает. Я искал это в Google, но безрезультатно ...

Кто-нибудь может мне помочь?

Diemauerdk
источник
Я тоже погуглил, но получил такой результат .
MC Emperor

Ответы:

161

\p{L}соответствует единственной кодовой точке в категории "буква".
\p{N}соответствует любому числовому символу в любом скрипте.

Источник: regular-expressions.info

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

Cerbrus
источник
спасибо за быстрый ответ :). Но разве регулярное выражение не должно соответствовать 10? Я пробовал онлайн-сопоставитель регулярных выражений: regexpal.com
Diemauerdk,
@ user1093774: Я не думаю, что regexpal поддерживает \p{}, но да, он должен совпадать.
Cerbrus
1
Этот синтаксис специфичен для современной реализации регулярных выражений Unicode, которую распознают не все интерпретаторы. Вы можете безопасно заменить \ p {L} на {a-zA-Z} (обозначение ascii) или {\ w} (обозначение perl / vim); и \ p {N} по {0-9} (ascii) или {\ d} (perl / vim). Если вы хотите сопоставить все из них, просто сделайте: {a-zA-Z0-9} + или {\ w \ d} +
Рафаэль Бекель
16
Рафаэль, я не согласен, что вы можете безопасно заменить \p{L}на {a-zA-Z}. {a-zA-Z}, например, не будет соответствовать ни одному символу с диакритическими знаками, например é, который используется во французском языке. Так что их можно безопасно заменить только в том случае, если вы уверены, что будете обрабатывать только английский язык, и ничего больше.
Rolf
Соответствует ли он кодовой точке или кодовой единице? stackoverflow.com/a/27331885/4928642
Qwertiy 07
30

Это ярлыки свойств Unicode ( \p{L}для букв Unicode, \p{N}для цифр Unicode). Они поддерживаются .NET, Perl, Java, PCRE, XML, XPath, JGSoft, Ruby (1.9 и выше) и PHP ( начиная с 5.1.0 ).

Во всяком случае, это очень странное регулярное выражение. Вы не должны использовать чередование, когда достаточно класса символов:

[\p{L}\p{N}_.-]*
Тим Пицкер
источник
его регулярное выражение в xml - я сам не создавал регулярное выражение :)
Diemauerdk
Помимо того, что использовались захватывающие круглые скобки, RE фактически будут компилироваться в одно и то же (ну, в любом оптимизирующем механизме RE, который \p{…}в первую очередь поддерживает стиль escape-последовательности).
Donal Fellows
это похоже на плагин XRegExp unicode. который, если так, будет любым буквенно-цифровым на любом языке
Тим
Спасибо, список поддерживаемых языков был полезен, не зная, что там есть ограничения (большинство регулярных выражений "универсальны").
HoldOffHunger
@HoldOffHunger: К сожалению, это далеко не так. Вот почему существует рынок таких инструментов, как RegexBuddy. Взгляните на regular-expressions.info/refbasic.html , вы будете поражены тонкими и не очень тонкими различиями между ароматами регулярных выражений ...
Тим Пицкер