Laut der Oniguruma-Dokumentation entspricht der Zeichensatz \d
:
Dezimalziffer char Unicode: General_Category - Decimal_Number
Beim Scannen nach \d
in einer Zeichenfolge mit allen Dezimal_Zeichenzeichen werden jedoch nur lateinische 0-9 Ziffern gefunden:
Fehle ich die Dokumentation falsch? Warum stimmt \d
nicht mit anderen Unicode-Ziffern überein und / oder gibt es eine Möglichkeit, dies zu tun?
Bekannt durch Brian Candler über Ruby-Talk :
\w
stimmt nur mit ASCII-Buchstaben und -Ziffern überein, während [[:alpha:]]
mit der vollständigen Menge an Unicode-Buchstaben übereinstimmt. \d
stimmt nur mit ASCII-Ziffern überein, während [[:digit:]]
mit der vollständigen Menge von Unicode-Zahlen übereinstimmt. Das Verhalten ist daher "konsistent", und wir haben eine einfache Problemumgehung für Unicode-Nummern. Auf \w
in demselben Oniguruma-Dokument nachgelesen sehen wir den Text:
Angesichts des realen Verhaltens von Ruby und des obigen "Not Unicode" -Text scheint es, dass die Dokumentation zwei Modi beschreibt - einen Unicode-Modus und einen Nicht-Unicode-Modus - und dass Ruby im Nicht-Unicode-Modus arbeitet .
Dies würde erklären, warum \d
nicht mit dem vollständigen Unicode-Satz übereinstimmt: Obwohl die Oniguruma-Dokumentation nicht genau beschreibt, was im Nicht-Unicode-Modus übereinstimmt, wissen wir jetzt, dass das als "Unicode" dokumentierte Verhalten nicht zutrifft erwartet.
Es bleibt dem Leser als Übung überlassen herauszufinden, wie (wenn überhaupt) der Unicode-Modus in Ruby-Regexps aktiviert wird, da das /u
-Flag (z. B. /\w/u
) dies nicht tut. (Vielleicht muss Ruby mit einem speziellen Flag für Oniguruma neu kompiliert werden.)
Aktualisieren : Das Onigurura-Dokument, das ich mit verknüpft habe, scheint nicht korrekt für Ruby 1.9 zu sein . Siehe diese Ticket-Diskussion , einschließlich dieser Beiträge:
[Yui NARUSE] "RE.txt ist für original Oniguruma, nicht für die regexp von Ruby 1.9. Wir brauchen vielleicht unser eigenes Dokument."
[Matz] "Unser Oniguruma ist gespalten. Der ursprüngliche Oniguruma, der in geocities.jp gefunden wurde, wurde nicht verändert."
Bessere Referenz : Hier finden Sie eine offizielle Dokumentation zur Syntax von regexp in Ruby 1.9:
Ссылка
Versuchen Sie stattdessen die Unicode-Zeichenklasse \p{N}
. Das entspricht allen Unicode-Ziffern. Keine Ahnung, warum \d
nicht funktioniert.
\d
passt standardmäßig nur für ASCII-Nummern. Sie können den Unicode-Abgleich in einem regulären Ausdruck mithilfe der (nicht intuitiven) (?u)
-Syntax manuell aktivieren:
Alternativ können Sie den Stil "posix" oder "unicode property" in Ihrer Regex verwenden, bei dem Sie die Unicode-Übereinstimmung nicht manuell aktivieren müssen:
%Vor%In diesem Blogpost finden Sie ausführlichere Informationen zum erweiterten Abgleich für Unicode-Zeichen in Ruby: Ссылка
Tags und Links ruby regex unicode character-properties