Regulärer Ausdruck \ p {L} und \ p {N}

105

Ich bin neu in regulären Ausdrücken und habe den folgenden regulären Ausdruck erhalten:

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

Ich weiß was * bedeutet und | bedeutet "oder" und das \ entkommt.

Aber was ich nicht weiß was \p{L}und \p{N}bedeutet. Ich habe Google danach gesucht, ohne Ergebnis ...

Kann mir jemand helfen?

Diemauerdk
quelle
Ich habe es auch gegoogelt, aber ich habe dieses Ergebnis erhalten .
MC Emperor

Antworten:

159

\p{L}entspricht einem einzelnen Codepunkt in der Kategorie "Buchstabe".
\p{N}Entspricht jeder Art von numerischem Zeichen in einem beliebigen Skript.

Quelle: reguläre-Ausdrücke.info

Wenn Sie häufig mit regulären Ausdrücken arbeiten, würde ich empfehlen, diese Site mit einem Lesezeichen zu versehen. Dies ist sehr nützlich.

Cerbrus
quelle
Danke für die schnelle Antwort :). Aber sollte der Regex dann nicht mit 10 übereinstimmen? Ich habe einen Online-Regex-Matcher ausprobiert
Diemauerdk
@ user1093774: Ich denke nicht, dass Regexpal unterstützt \p{}, aber ja, es sollte übereinstimmen.
Cerbrus
1
Diese Syntax ist spezifisch für die moderne Unicode-Regex-Implementierung, die nicht alle Interpreter erkennen. Sie können \ p {L} sicher durch {a-zA-Z} (ASCII-Notation) oder {\ w} (Perl / Vim-Notation) ersetzen. und \ p {N} durch {0-9} (ascii) oder {\ d} (perl / vim). Wenn Sie alle übereinstimmen möchten, tun Sie einfach: {a-zA-Z0-9} + oder {\ w \ d} +
Rafael Beckel
16
Rafael, ich nicht‘zustimmen , dass Sie sicher ersetzen \p{L}durch {a-zA-Z}. {a-zA-Z}Zum Beispiel passt es nicht zu einem akzentuierten Zeichen, wie es éauf Französisch überall verwendet wird. Diese sind also nur dann sicher austauschbar, wenn Sie sicher sind, dass Sie nur Englisch verarbeiten und sonst nichts.
Rolf
Entspricht es dem Codepunkt oder der Codeeinheit? stackoverflow.com/a/27331885/4928642
Qwertiy
30

Dies sind Unicode-Eigenschaftsverknüpfungen ( \p{L}für Unicode-Buchstaben, \p{N}für Unicode-Ziffern). Sie werden von .NET, Perl, Java, PCRE, XML, XPath, JGSoft, Ruby (1.9 und höher) und PHP ( seit 5.1.0 ) unterstützt.

Das ist jedenfalls eine sehr seltsame Regex. Sie sollten keine Abwechslung verwenden, wenn eine Zeichenklasse ausreichen würde:

[\p{L}\p{N}_.-]*
Tim Pietzcker
quelle
seine Regex in XML - ich habe die Regex nicht selbst
konstruiert
Abgesehen von der Tatsache, dass Erfassungsklammern verwendet wurden, werden die REs tatsächlich auf dieselbe Weise kompiliert (nun, in jeder optimierenden RE-Engine, die den \p{…}Escape-Sequenzstil überhaupt unterstützt ).
Donal Fellows
das sieht aus wie XRegExp Unicode Plugin. was, wenn ja, eine beliebige alphanumerische Zahl in einer beliebigen Sprache wäre
Tim
Vielen Dank, das Auflisten unterstützender Sprachen war nützlich, ohne zu wissen, dass es dort Einschränkungen gab (die meisten regulären Dinge sind "universell").
HoldOffHunger
@HoldOffHunger: Leider weit davon entfernt. Deshalb gibt es einen Markt für Tools wie RegexBuddy. Werfen Sie einen Blick auf reguläre-Ausdrücke.info / refbasic.html , Sie werden erstaunt sein über die subtilen und nicht so subtilen Unterschiede zwischen Regex-Aromen ...
Tim Pietzcker