Nach Unicode-Nummern in einer Zeichenkette mit \ d suchen

8

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:

%Vor%

Fehle ich die Dokumentation falsch? Warum stimmt \d nicht mit anderen Unicode-Ziffern überein und / oder gibt es eine Möglichkeit, dies zu tun?

    
Phrogz 09.08.2011, 15:28
quelle

3 Antworten

2

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:

%Vor%

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.

%Vor%

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:
Ссылка

    
Phrogz 09.08.2011, 22:30
quelle
1

Versuchen Sie stattdessen die Unicode-Zeichenklasse \p{N} . Das entspricht allen Unicode-Ziffern. Keine Ahnung, warum \d nicht funktioniert.

    
Tim Pietzcker 09.08.2011 15:54
quelle
1

\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:

%Vor%

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: Ссылка

    
J-_-L 26.03.2016 14:24
quelle