Javascript RegExp + boundaries + unicode-Zeichen
Ich bin Gebäude Suche, und ich werde verwenden javascript autocomplete mit. Ich bin aus Finnland (in finnischer Sprache), so habe ich Umgang mit einigen Sonderzeichen wie ä, ö und å
Wenn der Benutzer die Typen text in dem Eingabefeld für die Suche, die ich versuchen, den text zu Daten.
Hier ist ein einfaches Beispiel, das nicht ordnungsgemäß funktioniert, wenn Benutzer-Typen, zum Beispiel """". Gleiche Sache mit "äl"
var title = "this is simple string with finnish word tämä on ääkköstesti älkää ihmetelkö";
//Does not work
var searchterm = "äl";
//does not work
//var searchterm = "ää";
//Works
//var searchterm = "wi";
if ( new RegExp("\\b"+searchterm, "gi").test(title) ) {
$("#result").html("Match: ("+searchterm+"): "+title);
} else {
$("#result").html("nothing found with term: "+searchterm);
}
So, wie bekomme ich diese ä,ö und å sind Zeichen für die Arbeit mit javascript regex?
Ich denke, ich sollte die Verwendung der unicode-codes, aber wie soll ich das machen? Codes für diese Zeichen sind:
[\u00C4,\u00E4,\u00C5,\u00E5,\u00D6,\u00F6]
=> äÄåÅöÖ
\b
bedeutet "Wortgrenze" in einer regex; der Schrägstrich ist entgangen, weil hier in einem string.Danke, komisch dass ich das nicht gesehen :/
Ich benutze den \b, weil ich will Spiel am Anfang jedes Wort.
Wie Sie sehen, ist Javascript stecken in der idiotische 1960-Jahre-Stil nur ASCII-Mentalität. Erfüllen Sie nicht sogar die meisten basic conformance Anforderungen, die für Level 1 der "Grundlegenden Unicode-Support" pro UTS#18 auf Unicode Regular Expressions. Versuchen zu tun, echte Unicode-text-Bearbeitung in Javascript eine schreckliche Witz, und eine grausame, zu: es kann nicht getan werden. Die XRegexp plugin unten genannten ist notwendig, aber nicht ausreichend für diese Zwecke.
InformationsquelleAutor user1394520 | 2012-05-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es ein problem mit Regex und das Wort Grenze
\b
matching am Anfang einer Zeichenfolge beginnend mit einem Charakter aus dem normalen 256-byte-Bereich.Anstatt
\b
, versuchen Sie es mit(?:^|\\s)
Aufteilung:
(?:
Klammer()
form eines capture-Gruppe in Regex. Klammer begann mit einem Fragezeichen und Doppelpunkt?:
form einer non-capturing-group. Sie haben einfach Gruppe die Begriffe zusammen^
caret-symbol entspricht dem Anfang einer Zeichenfolge|
die bar ist der "oder" - operator.\s
entspricht Leerzeichen (wird als\\s
im string, denn wir haben zu entkommen backslash))
schließt die GruppeAnstatt also mit
\b
, was mit Wort-Grenzen und funktioniert nicht für unicode-Zeichen, verwenden wir eine non-capturing-group mit dem Anfang einer Zeichenfolge ODER ein Leerzeichen."versuchen, diese" ist keine Lösung. Geben Sie einige Informationen über warum die vorgeschlagenen regex funktioniert. Was bedeutet
(?:^|\\s)
wirklich tun? Sie nicht erklären, diese Lösung überhaupt.guter Punkt.
Dies ist NICHT die richtige Lösung.
(?:^|\\s)
ist nicht eine null-Breite assertion wie\b
ist, und verbraucht Charaktere aus dem Spiel. Der eine positive lookahead-wäre eine bessere Idee ((?=^|\\s)
) würde aber nur funktionieren, nach dem Spiel, wie lookbehind wird noch nicht unterstützt. Auch, Wortgrenzen werden nicht nur Leerzeichen und string Grenzen, aber eine Tonne von anderen Zeichen.Gibt es einen Grund, nicht zu include $ (Ende der Zeichenkette) in der regex? I. e. (?:^|\s|$)
InformationsquelleAutor mowwwalker
Den
\b
Charakter-Klasse in JavaScript RegEx ist wirklich nur sinnvoll mit einfachen ASCII-Codierung.\b
ist eine Verknüpfung code für die Grenze zwischen\w
und\W
sets oder\w
und den Anfang oder das Ende des Strings. Diese Zeichensätze sind nur zu berücksichtigen ASCII "Wort" - Zeichen, wo\w
gleich[a-zA-Z0-9_]
und\W
ist die negation der Klasse.Dies macht die RegEx-Zeichenklassen weitgehend nutzlos für den Umgang mit real existierenden Sprache.
\s
sollte, was Sie tun möchten, vorausgesetzt, die Begriffe sind nur getrennt durch Leerzeichen.\b
ist nicht eine Charakter-Klasse Kürzel wie\w
und\s
, es ist ein null-Breite assertion wie\A
,$
, und lookarounds.Das könnte helfen! github.com/joelarson4/CharFunk
InformationsquelleAutor Noah Freitas
diese Frage ist alt, aber ich glaube, ich fand eine bessere Lösung für die Grenze in reguläre Ausdrücke, die unicode-Buchstaben.
Mit XRegExp implementieren Sie einen gültigen \b-Begrenzung der Ausweitung dieses
das Ergebnis ist ein 4000+ char lange, aber es scheint zu funktionieren ganz durchführen.
Einige Erklärung: (?= ) ist eine null-Länge lookahead sieht, die für eine begin-oder end-Grenze oder eine nicht-Brief unicode-Zeichen. Der wichtigste glaube, ist der lookahead, weil das \b erfasst nicht alles: es ist einfach true oder false.
InformationsquelleAutor max masetti
Ich würde Ihnen empfehlen,XRegExp, wenn Sie arbeiten müssen, mit einem bestimmten Satz von Zeichen aus Unicode, der Autor dieser Bibliothek zugeordnet, alle Art von regionalen Gruppen von Zeichen, die die Arbeit mit verschiedenen Sprachen zu erleichtern.
InformationsquelleAutor micnic
Bemerkte ich etwas, das wirklich komisch mit
\b
bei Verwendung von Unicode:Scheint es, dass die Bedeutung von
\b
und\B
sind vertauscht, aber nur, wenn verwendet mit nicht-ASCII-Unicode? Es könnte etwas tiefer Los hier, aber ich bin mir nicht sicher, was es ist.In jedem Fall, es scheint, dass das Wort Grenze ist das Problem, nicht die Unicode-Zeichen von sich. Vielleicht sollte man einfach ersetzen
\b
mit(^|[\s\\/-_&])
, wie es scheint, um korrekt zu arbeiten. (Machen Sie Ihre eigene Liste von Symbolen umfassender als mir, obwohl.)\b
und\B
sind nicht Unicode-kompatibel in JavaScript, so dass Sie betrachtenä
ein nicht-alphanumerisches Zeichen und sehen daher ein Wort-Grenze zwischenp
undä
.InformationsquelleAutor apsillers
Meine Idee ist die Suche mit codes für die finnischen Buchstaben
new RegExp("\\b"+asciiOnly(searchterm), "gi").test(asciiOnly(title))
Meine ursprüngliche Idee war es, einfach aus
encodeURI
aber das % - Zeichen schien zu stören mit der regexp.http://jsfiddle.net/7TsxB/5/
Schrieb ich einen feuchten Funktion mit encodeURI enkodieren jedes Zeichen mit code über 128 aber entfernen, % und das hinzufügen von 'QQ' am Anfang. Es ist nicht der beste marker, aber ich konnte nicht nicht alphanumerischen arbeiten.
QQ
Sie können ein Steuerelement Zeichenfolge___
ist ein bisschen sicherer und noch ascii, und stattencodeURI
Sie nutzen können javascript nativeescape
/unescape
Methoden, aber ansonsten ist es macht den job.dies ist keine gute Lösung für diejenigen, die etwas tun wollen mit übereinstimmenden Teilstrings
Tut dies übernehmen keine nicht-ASCII-Zeichen zu einem Wort, Charakter? Zum Beispiel, "äl" würde nicht so behandelt werden, als der Anfang eines Wortes, in "?älkää", obwohl es sein sollte.
InformationsquelleAutor Heitor Chang
Ich hatte ein ähnliches problem, aber ich hatte zu ersetzen, eine Reihe von Bedingungen. Alle Lösungen, die ich gefunden habe nicht funktioniert, wenn sich zwei Begriffe wurden im text nebeneinander (weil Ihre Grenzen overlaped). So musste ich ein wenig modifiziert Ansatz:
Finden Sie den code in ein Turnschuh: http://jsfiddle.net/antoninslejska/bvbLpdos/1/
Dem regulären Ausdruck ist inspiriert von: http://breakthebit.org/post/3446894238/word-boundaries-in-javascripts-regular
Kann ich nicht sagen, ich finde die Lösung elegant...
InformationsquelleAutor Antonín Slejška
Was Sie suchen, ist die Unicode-word-Grenzen standard:
http://unicode.org/reports/tr29/tr29-9.html#Word_Boundaries
Es ist eine JavaScript-Implementierung, die hier (unciodejs.wordbreak.js)
https://github.com/wikimedia/unicodejs
InformationsquelleAutor Ed.