Was ist der einfachste Weg, um Nicht-ASCII-Zeichen in einem regulären Ausdruck abzugleichen? Ich möchte alle Wörter einzeln in einer Eingabezeichenfolge abgleichen, aber die Sprache ist möglicherweise nicht Englisch, daher muss ich Dinge wie ü, ö, ß und ñ abgleichen. Dies ist auch in Javascript / jQuery der Fall, daher muss jede Lösung darauf angewendet werden.
javascript
jquery
regex
Paul Wicks
quelle
quelle
all words
klingt es so, als ob Sie nur nicht englische Buchstaben und nicht alle nicht englischen Zeichen möchten, wie in Ihrem Fragentitel angegeben.Antworten:
Dies sollte es tun:
Es entspricht jedem Zeichen, das nicht im ASCII-Zeichensatz enthalten ist (0-127, dh 0x0 bis 0x7F).
Mit Unicode können Sie dasselbe tun:
Für Unicode können Sie sich diese 2 Ressourcen ansehen:
quelle
[\u00BF-\u1FFF\u2C00-\uD7FF\w]
als Brief definiert.[\u00C0-\u1FFF\u2C00-\uD7FF\w]
(ohne umgekehrtes Fragezeichen¿
) Beziehen Sie sich für Bereiche auf BMP .00C0
istÀ
in Latin-1 Supplement ,1FFF
ist das letzte Zeichen von Greek Extended,2C00
ist der erste Buchstabe in Glagolitic undD7FF
ist das letzte Zeichen in Hangul Jamo Extended-B. Es ist also alles außer: Symbolen und Sonderzeichen auf 2 ersten Blöcken; Symbole in mittleren Blöcken; Surrogate, Priv-Bereich und Sonderzeichen in Endblöcken.Dieser reguläre Ausdruck passt zu allen Wörtern im Text einer beliebigen Sprache ...
quelle
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
Die Situation mit Regexen, Unicode und Javascript ist zum Kotzen. Es ist lächerlich, dass sich Programmierer auf externe Bibliotheken verlassen müssen, um zu erkennen, dass "Αλφα" ein Wort oder sogar "é" ein Buchstabe ist.
Aber so geht es.
Dieser Typ hat eine gute Bibliothek für den Umgang mit Unicode in Javascript Regexes geschrieben:
http://blog.stevenlevithan.com/archives/javascript-regex-and-unicode
Das Unicode-Zeug ist ein Plugin für diese Regex-Bibliothek:
http://xregexp.com/
Hier ist ein Beitrag über die Unicode-Erweiterung:
http://blog.stevenlevithan.com/archives/xregexp-unicode-plugin
Und die Erweiterungsseite selbst:
http://xregexp.com/plugins/
Tolle Arbeit, aber es nervt mich immer noch, dass Javascript in dieser Hinsicht so rückständig ist.
(Er hat ein Buch für O'Reilly über das Thema geschrieben, daher ist es gut möglich, dass er weiß, wovon er spricht.)
Die Art und Weise, wie er es implementiert hat, besteht darin, Zeichentabellen mit bestimmten Eigenschaften hinzuzufügen. Wenn Sie dann einen regulären Ausdruck mit seiner Bibliothek erstellen,
\p{charclass}
wird dieser durch ersetzt[allthecharactersintheclass]
.quelle
Unicode Property Escapes gehören zu den Funktionen von ES2018.
Grundlegende Verwendung
Mit Unicode Property Escapes können Sie einen Buchstaben aus einer beliebigen Sprache mit dem folgenden einfachen regulären Ausdruck abgleichen:
Oder mit der Kurzform, noch knapper:
Passende Wörter
In Bezug auf die konkreten Anwendungsfall die Frage (Matching Wörter), beachten Sie, dass Sie Unicode Property Escapes in Zeichenklassen verwenden können, so dass es leicht Buchstaben passen zusammen mit anderen Wort-Zeichen wie Bindestriche:
Wenn Sie alles zusammenfügen, können Sie Wörter aller [1] Sprachen mit diesem wunderschön kurzen RegEx abgleichen:
Beispiel (schamlos aus der obigen Antwort eingesteckt ):
Browser-Unterstützung
Ab sofort (Dezember 2018) konnte ich diesen regulären Ausdruck nur in Chrome (und anderen Blink-basierten Browsern wie Opera, Vivaldi oder zukünftigen Versionen von Microsoft Edge) und Safari (ab Version 12, frühere Tests mit Version 11) erfolgreich testen gescheitert). Da die Spezifikation jedoch fertig ist und die Funktion standardisiert ist, erwarten Sie, dass bald weitere moderne Browser folgen.
Ich habe eine kleine Website erstellt, auf der Sie überprüfen können, ob Ihr Browser Unicode Property Escapes unterstützt.
Transpiling
Unicode-Eigenschafts-Escapes können mit einem Tool namens regexpu auf ES5 übertragen werden . Es gibt eine Online - Demo verfügbar hier . Wie Sie in der Demo sehen können, können Sie heute tatsächlich nicht-lateinische Buchstaben mit dem folgenden (schrecklich langen) regulären ES5-Ausdruck abgleichen:
Wenn Sie Babel verwenden, gibt es dafür auch ein Plugin mit Regexpu-Unterstützung ( Babel v6-Plugin , Babel v7-Plugin ).
quelle
u
Flag wurde in ES2015 eingeführt und ermöglicht verschiedene Funktionen im Zusammenhang mit Unicode (z. B. die in meiner Antwort erwähnte Eigenschaft, obwohl diese erst einige Jahre später eingeführt wurden). Da die Unicode-bezogenen Funktionen die Semantik einiger Regex-Muster geringfügig ändern, muss dies explizit aktiviert werden - durch Hinzufügen diesesu
Flags.Die Antwort von Jeremy Ruten ist großartig, aber ich denke, es ist nicht genau das, wonach Paul Wicks gesucht hat. Wenn ich das richtig verstehe, fragte Paul nach dem Ausdruck, um nicht-englischen Wörtern wie
können
oder zu entsprechenmóc
. Jeremys Regex stimmt nur mit nicht englischen Buchstaben überein, daher besteht ein kleiner Verbesserungsbedarf:oder
Dieser
[^\x00-\x7F]
und dieser[^\u0000-\u007F]
Teil ermöglichen es, dass der Regullar-Ausdruck mit nicht-englischen Buchstaben übereinstimmt.Dies
(|)
ist logisch oder und\w
ist ein englischer Buchstabe,([^\u0000-\u007F]|\w)
passt also zu einem einzelnen englischen oder nicht englischen Buchstaben.+
am Ende des Ausdrucks bedeutet, dass er wiederholt werden kann, sodass der gesamte Ausdruck zulässt, dass alle englischen oder nicht englischen Buchstaben übereinstimmen.Hier können Sie den ersten Ausdruck mit verschiedenen Zeichenfolgen testen und hier ist der zweite.
quelle
Sie machen das gleiche wie bei jedem anderen Zeichenabgleich, verwenden jedoch \ uXXXX, wobei XXXX die Unicode-Nummer des Zeichens ist.
Siehe: http://unicode.org/charts/charindex.html
http://unicode.org/charts/
http://www.decodeunicode.org/
quelle
Alle Unicode-fähigen Regex-Varianten sollten eine Sonderzeichenklasse wie \ w haben, die mit jedem Unicode-Buchstaben übereinstimmt. Schauen Sie sich hier Ihren spezifischen Geschmack an .
quelle
Ich hatte ein Problem damit, dass \ p wie erwartet funktioniert, also habe ich einfach eine andere Strategie angewendet wie:
Finden Sie alles, was kein Tabulatorzeichen ist, bis zum nächsten Tabulatorzeichen ... dies hängt natürlich von Ihrer Suchquelle ab, aber Sie haben die Idee. Jetzt muss ich nicht mehr herausfinden, welche Unicode-Zeichen funktionieren und welche nicht usw.
quelle