Expressão regular \ p {L} e \ p {N}

106

Eu sou novo em expressões regulares e recebi a seguinte expressão regular:

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

Eu sei o que * significa e | significa "ou" e esse \ escapa.

Mas o que eu não sei o que \p{L}e \p{N}meios. Procurei no Google por isso, sem resultado ...

Alguém pode me ajudar?

Diemauerdk
fonte
Eu pesquisei no Google também, mas consegui esse resultado .
MC Imperador

Respostas:

160

\p{L}corresponde a um único ponto de código na categoria "letra".
\p{N}corresponde a qualquer tipo de caractere numérico em qualquer script.

Fonte: regular-expressions.info

Se você vai trabalhar muito com expressões regulares, sugiro marcar esse site, é muito útil.

Cerbrus
fonte
obrigado pela resposta rápida :). Mas a regex não deveria corresponder a 10? Eu tentei um matcher regex online: regexpal.com
Diemauerdk
@ user1093774: Não acho que o regexpal suporte \p{}, mas sim, deve corresponder.
Cerbrus de
1
Essa sintaxe é específica para a implementação de regex Unicode moderna, que nem todos os interpretadores reconhecem. Você pode substituir \ p {L} com segurança por {a-zA-Z} (notação ascii) ou {\ w} (notação perl / vim); e \ p {N} por {0-9} (ascii) ou {\ d} (perl / vim). Se você quiser combinar todos eles, basta fazer: {a-zA-Z0-9} + ou {\ w \ d} +
Rafael Beckel
16
Rafael, não concordo que você possa substituir com segurança \p{L}por {a-zA-Z}. {a-zA-Z}, por exemplo, não corresponderá a nenhum caractere acentuado, como é, que é usado em francês. Portanto, eles só podem ser substituídos com segurança se você tiver certeza de que processará apenas inglês e nada mais.
Rolf
Corresponde ao ponto de código ou unidade de código? stackoverflow.com/a/27331885/4928642
Qwertiy
30

Esses são atalhos de propriedade Unicode ( \p{L}para letras Unicode, \p{N}para dígitos Unicode). Eles são suportados por .NET, Perl, Java, PCRE, XML, XPath, JGSoft, Ruby (1.9 e superior) e PHP ( desde 5.1.0 )

De qualquer forma, é um regex muito estranho. Você não deve usar alternância quando uma classe de personagem seria suficiente:

[\p{L}\p{N}_.-]*
Tim Pietzcker
fonte
seu regex em xml - eu não construí o regex sozinho :)
Diemauerdk
Além do fato de que foram usados ​​parênteses de captura, os REs irão, na verdade, compilar para a mesma coisa (bem, em qualquer mecanismo RE otimizado que suporta o \p{…}estilo de sequência de escape em primeiro lugar).
Donal Fellows de
que se parece com o plugin Unicode XRegExp. que se sim, seria qualquer alfanumérico em qualquer idioma
Tim
Obrigado, listar os idiomas de suporte foi útil, sem saber que havia limitações lá (a maioria das coisas do regex sendo "universal").
HoldOffHunger
@HoldOffHunger: Longe disso, infelizmente. É por isso que existe um mercado para ferramentas como o RegexBuddy. Dê uma olhada em regular-expressions.info/refbasic.html , você ficará surpreso com as diferenças sutis e não tão sutis entre os sabores de regex ...
Tim Pietzcker