Expression régulière \ p {L} et \ p {N}

106

Je suis nouveau dans les expressions régulières et j'ai reçu l'expression régulière suivante:

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

Je sais ce que signifie * et | signifie "ou" et que \ s'échappe.

Mais ce que je ne sais pas quoi \p{L}et \p{N}signifie. Je l'ai cherché sur Google, sans résultat ...

Est-ce que quelqu'un peut m'aider?

Diemauerdk
la source
Je l'ai googlé aussi, mais j'ai obtenu ce résultat .
MC Emperor

Réponses:

160

\p{L}correspond à un seul point de code dans la catégorie «lettre».
\p{N}correspond à tout type de caractère numérique dans n'importe quel script.

Source: regular-expressions.info

Si vous allez beaucoup travailler avec des expressions régulières, je vous suggère de mettre ce site en favori, c'est très utile.

Cerbrus
la source
merci pour la réponse rapide :). Mais le regex ne devrait-il pas alors correspondre à 10? J'ai essayé un matcher regex en ligne: regexpal.com
Diemauerdk
@ user1093774: Je ne pense pas que regexpal supporte \p{}, mais oui, cela devrait correspondre.
Cerbrus
1
Cette syntaxe est spécifique à l'implémentation moderne de regex Unicode, que tous les interprètes ne reconnaissent pas. Vous pouvez remplacer en toute sécurité \ p {L} par {a-zA-Z} (notation ascii) ou {\ w} (notation perl / vim); et \ p {N} par {0-9} (ascii) ou {\ d} (perl / vim). Si vous voulez tous les faire correspondre, faites simplement: {a-zA-Z0-9} + ou {\ w \ d} +
Rafael Beckel
16
Rafael, je ne suis pas d'accord pour dire que vous pouvez remplacer en toute sécurité \p{L}par {a-zA-Z}. {a-zA-Z}, par exemple, ne correspondra à aucun caractère accentué, tel que é, qui est utilisé partout en français. Donc, ceux-ci ne sont remplaçables en toute sécurité que si vous êtes sûr que vous ne traiterez que l'anglais, et rien d'autre.
Rolf
Correspond-il au point de code ou à l'unité de code? stackoverflow.com/a/27331885/4928642
Qwertiy
30

Ce sont des raccourcis de propriété Unicode ( \p{L}pour les lettres Unicode, \p{N}pour les chiffres Unicode). Ils sont pris en charge par .NET, Perl, Java, PCRE, XML, XPath, JGSoft, Ruby (1.9 et supérieur) et PHP ( depuis 5.1.0 )

En tout cas, c'est une regex très étrange. Vous ne devriez pas utiliser l'alternance lorsqu'une classe de caractères suffirait:

[\p{L}\p{N}_.-]*
Tim Pietzcker
la source
son regex en xml - je n'ai pas construit le regex moi-même :)
Diemauerdk
Outre le fait que des parenthèses de capture ont été utilisées, les REs compileront en fait à la même chose (enfin, dans tout moteur d'optimisation RE prenant en charge le \p{…}style de séquence d'échappement en premier lieu).
Donal Fellows
qui ressemble au plugin unicode XRegExp. qui, si tel est le cas, serait n'importe quel alphanumérique dans n'importe quelle langue
Tim
Merci, la liste des langues de support était utile, sans savoir qu'il y avait des limitations là-bas (la plupart des choses regex'y étant "universelles").
HoldOffHunger
@HoldOffHunger: Loin de là, malheureusement. C'est pourquoi il existe un marché pour des outils comme RegexBuddy. Jetez un œil à regular-expressions.info/refbasic.html , vous serez étonné des différences subtiles et pas si subtiles entre les saveurs de regex ...
Tim Pietzcker