Ich habe auf Stack - Überlauf (sehe ersetzen Zeichen .. eh , wie JavaScript , um den Unicode - Standard über RegExp nicht folgen , etc.) und hat nicht wirklich eine konkrete Antwort auf die Frage gefunden:
How can JavaScript match for accented characters (those with diacritical marks)?
Ich zwinge ein Feld in einer Benutzeroberfläche dazu, dem Format zu entsprechen: last_name, first_name
(letztes [Komma] zuerst) , und ich möchte diakritische Zeichen unterstützen, aber in JavaScript ist es offensichtlich etwas schwieriger als in anderen Sprachen / Plattformen.
Dies war meine ursprüngliche Version, bis ich diakritische Unterstützung hinzufügen wollte:
/^[a-zA-Z]+,\s[a-zA-Z]+$/
Derzeit diskutiere ich über eine von drei Methoden, um Unterstützung hinzuzufügen, die ich alle getestet habe und arbeite (zumindest bis zu einem gewissen Grad weiß ich nicht wirklich, wie groß der zweite Ansatz ist). Hier sind sie:
Explizite Auflistung aller Zeichen mit Akzent, die ich als gültig akzeptieren möchte (lahm und übermäßig kompliziert):
var accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ";
// Build the full regex
var regex = "^[a-zA-Z" + accentedCharacters + "]+,\\s[a-zA-Z" + accentedCharacters + "]+$";
// Create a RegExp from the string version
regexCompiled = new RegExp(regex);
// regexCompiled = /^[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+,\s[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+$/
- Dies stimmt korrekt mit einem Nach- / Vornamen mit einem der unterstützten Zeichen mit Akzent in überein
accentedCharacters
.
Mein anderer Ansatz war, die .
Zeichenklasse zu verwenden , um einen einfacheren Ausdruck zu haben:
var regex = /^.+,\s.+$/;
- Dies würde für fast alles passen, zumindest in Form von :
something, something
. Das ist in Ordnung, nehme ich an ...
Der letzte Ansatz, den ich gerade gefunden habe, könnte einfacher sein ...
/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
- Es passt zu einer Reihe von Unicode-Zeichen - getestet und funktioniert, obwohl ich nichts Verrücktes ausprobiert habe, nur das normale Zeug, das ich in unserer Sprachabteilung für Namen von Fakultätsmitgliedern sehe.
Hier sind meine Bedenken:
- Die erste Lösung ist viel zu einschränkend und schlampig und verworren. Es müsste geändert werden, wenn ich ein oder zwei Charaktere vergessen hätte, und das ist einfach nicht sehr praktisch.
- Die zweite Lösung ist besser, prägnant, passt aber wahrscheinlich weit mehr als sie eigentlich sollte. Ich konnte keine wirkliche Dokumentation darüber finden , was genau
.
übereinstimmt, nur die Verallgemeinerung von "irgendeinem Zeichen außer dem Zeilenumbruchzeichen" (aus einer Tabelle im MDN ). Die dritte Lösung scheint die genaueste zu sein, aber gibt es Fallstricke? Ich bin nicht sehr vertraut mit Unicode, zumindest in der Praxis, aber bei einer Suche Code - Tabelle / Fortsetzung der Tabelle ,
\u00C0-\u017F
scheint ziemlich fest zu sein, zumindest für meine erwartete Eingabe.- Die Fakultät wird keine Formulare mit ihren Namen in ihrer Muttersprache (z. B. Arabisch, Chinesisch, Japanisch usw.) einreichen, sodass ich mich nicht um Zeichen mit nicht lateinischem Zeichensatz kümmern muss
Die eigentliche Frage (n) : Welcher dieser drei Ansätze eignet sich am besten für die Aufgabe? Oder gibt es bessere Lösungen?
quelle
regex = /^[^,]+,\s[^,]+$/;
, um das zu verhindern..
Atom passt zu allem außer Zeilenumbrüchen " ist eigentlich ziemlich genau :-)Antworten:
Der einfachere Weg, alle Akzente zu akzeptieren, ist folgender:
Unter https://unicode-table.com/en/ finden Sie Zeichen in numerischer Reihenfolge.
quelle
-
definiert einen Bereich, und diese Technik nutzt die Reihenfolge der Zeichen im Zeichensatz, um einen kontinuierlichen Bereich zu definieren, was zu einer sehr präzisen Lösung des Problems führtZ
unda
)?Der akzentuierte lateinische Bereich
\u00C0-\u017F
reichte für meine Datenbank mit Namen nicht aus, daher erweiterte ich den regulären Ausdruck aufIch habe diese Codeblöcke hinzugefügt (
\u00C0-\u024F
enthält drei benachbarte Blöcke gleichzeitig):\u00C0-\u00FF
Latin-1-Beilage\u0100-\u017F
Lateinisch Extended-A\u0180-\u024F
Latin Extended-B\u1E00-\u1EFF
Latin Extended AdditionalBeachten Sie, dass dies
\u00C0-\u00FF
eigentlich nur ein Teil des Latin-1-Supplements ist . Dieser Bereich überspringt nicht druckbare Steuersignale und alle Symbole mit Ausnahme der ungünstig platzierten Multiplikation ×\u00D7
und Division ÷\u00F7
.Wenn Sie mehr Codepunkte benötigen, finden Sie weitere Bereiche in der Wikipedia- Liste der Unicode-Zeichen . Zum Beispiel könnten Sie auch Latin Extended-C , D und E hinzufügen , aber ich habe sie weggelassen, weil nur Historiker jetzt an ihnen interessiert zu sein scheinen und die D- und E-Sets in meinem Browser nicht einmal richtig gerendert werden.
Der ursprüngliche Regex, der bei
\u017F
anhält, trägt den Namen "Șenol". Laut dem Unicode Analyzer von FontSpace lautet das erste Zeichen\u0218
LATIN CAPITAL LETTER S WITH COMMA BELOW. (Ja, normalerweise wird es mit einem Cedilla-S geschrieben\u015E
, "olenol". Aber ich fliege nicht in die Türkei, um ihm zu sagen: "Du schreibst deinen Namen falsch!")quelle
[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]
Abhängig von der Aufgabe :-) Um genau allen lateinischen Zeichen und ihren akzentuierten Versionen zu entsprechen, bieten die Unicode-Bereiche wahrscheinlich die beste Lösung. Sie können auf alle Nicht-Leerzeichen erweitert werden, was mit der
\S
Zeichenklasse erfolgen kann.Das grundlegendste Problem, das ich hier sehe, sind keine Diakritika, sondern Leerzeichen. Es gibt einige Namen, die aus mehreren Wörtern bestehen, z. B. für Titel. Sie sollten sich also für das allgemeinste entscheiden, das alles außer dem Komma zulässt, das den Vor- und Nachnamen unterscheidet:
Aber Ihre zweite Lösung mit der
.
Zeichenklasse ist genauso gut, dass Sie sich dann möglicherweise nur um mehrere Kommas kümmern müssen.quelle
any_character_not_a_comma, any_character_not_a_comma
? Das dachte ich mir, als ich es zum ersten Mal las. Ich war etwas verwirrt, als ich dort drei Kommas sah.s
Leerzeichen…[^\s]
um\S
Die XRegExp- Bibliothek verfügt über ein Plugin namens Unicode , mit dessen Hilfe solche Aufgaben gelöst werden können.
Es wird in den Kommentaren zur Frage erwähnt, ist aber leicht zu übersehen. Ich habe es erst bemerkt, nachdem ich diese Antwort eingereicht habe.
quelle
anything, anything
. Dies wird für zukünftige Leser nützlich sein :)Wie wäre es damit?
quelle
Šš
.Was ist damit?
Es wird jedes Wort mit akzentuierten Zeichen übereinstimmen oder nicht.
quelle
aus diesem Wiki: https://en.wikipedia.org/wiki/List_of_Unicode_characters#Basic_Latin
für lateinische buchstaben benutze ich
Es vermeidet Bindestriche und Sonderzeichen
quelle
Erläuterung:
\pL
- passt zu jeder Art von Brief aus jeder Sprache\pM
- greift ein Zeichen an, das mit einem anderen Zeichen kombiniert werden soll (z. B. Akzente, Umlaute, umschließende Kästchen usw.)\p{Zs}
- Entspricht einem Leerzeichen, das unsichtbar ist, aber Platz beanspruchtu
- Muster- und Betreffzeichenfolgen werden als UTF-8 behandeltIm Gegensatz zu anderen vorgeschlagenen regulären Ausdrücken (z. B.
[A-Za-zÀ-ÖØ-öø-ÿ]
) funktioniert dies mit allen sprachspezifischen Zeichen, z. B.Šš
entspricht diese Regel, nicht jedoch anderen auf dieser Seite.Leider unterstützt JavaScript diese Klassen von Haus aus nicht. Sie können jedoch
xregexp
zquelle
Sie können die diakritischen Zeichen aus Alphabeten entfernen, indem Sie Folgendes verwenden:
Es entfernt alle diakritischen Zeichen und führt dann Ihren Regex darauf durch
Referenz:
https://thread.engineering/2018-08-29-searching-and-sorting-text-with-diacritical-marks-in-javascript/
quelle