Expresión regular \ p {L} y \ p {N}

106

Soy nuevo en las expresiones regulares y se me ha dado la siguiente expresión regular:

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

Sé lo que * significa y | significa "o" y eso se escapa.

Pero lo que no sé qué \p{L}y \p{N}medios. Lo he buscado en Google, sin resultado ...

¿Alguien me puede ayudar?

Diemauerdk
fuente
También lo busqué en Google, pero obtuve este resultado .
MC Emperor

Respuestas:

160

\p{L}coincide con un solo punto de código en la categoría "letra".
\p{N}coincide con cualquier tipo de carácter numérico en cualquier script.

Fuente: regular-expressions.info

Si va a trabajar mucho con expresiones regulares, le sugiero que marque ese sitio como favorito, es muy útil.

Cerbrus
fuente
gracias por la respuesta rápida :). Pero, ¿no debería la expresión regular coincidir con 10? Probé un comparador de
Diemauerdk
@ user1093774: No creo que regexpal sea compatible \p{}, pero sí, debería coincidir.
Cerbrus
1
Esta sintaxis es específica para la implementación moderna de expresiones regulares Unicode, que no todos los intérpretes reconocen. Puede reemplazar de forma segura \ p {L} por {a-zA-Z} (notación ascii) o {\ w} (notación perl / vim); y \ p {N} por {0-9} (ascii) o {\ d} (perl / vim). Si desea combinarlos todos, simplemente haga: {a-zA-Z0-9} + o {\ w \ d} +
Rafael Beckel
16
Rafael, no estoy de acuerdo en que puedas reemplazar \p{L} por {a-zA-Z}. {a-zA-Z}, por ejemplo, no coincidirá con ningún carácter acentuado, como é, que se utiliza en todo el francés. Por lo tanto, solo se pueden reemplazar de manera segura si está seguro de que solo procesará inglés y nada más.
Rolf
¿Coincide con el punto de código o la unidad de código? stackoverflow.com/a/27331885/4928642
Qwertiy
30

Estos son atajos de propiedad Unicode ( \p{L}para letras Unicode, \p{N}para dígitos Unicode). Son compatibles con .NET, Perl, Java, PCRE, XML, XPath, JGSoft, Ruby (1.9 y superior) y PHP ( desde 5.1.0 )

En cualquier caso, esa es una expresión regular muy extraña. No deberías usar alternancia cuando una clase de personaje sería suficiente:

[\p{L}\p{N}_.-]*
Tim Pietzcker
fuente
su expresión regular en xml - no he construido la expresión regular yo mismo :)
Diemauerdk
Aparte del hecho de que se utilizaron paréntesis de captura, los RE se compilarán en lo mismo (bueno, en cualquier motor RE optimizado que admita el \p{…}estilo de secuencia de escape en primer lugar).
Donal Fellows
que se parece al complemento Unicode XRegExp. que, de ser así, sería alfanumérico en cualquier idioma
Tim
Gracias, la lista de idiomas de apoyo fue útil, sin saber que había limitaciones (la mayoría de las expresiones regulares son "universales").
HoldOffHunger
@HoldOffHunger: Lejos de eso, desafortunadamente. Es por eso que existe un mercado para herramientas como RegexBuddy. Eche un vistazo a regular-expressions.info/refbasic.html , se sorprenderá de las diferencias sutiles y no tan sutiles entre los sabores de
expresiones