2010-09-12 14 views
5

Ich habe einen regulären JavaScript-Ausdruck, der im Grunde Wörter aus zwei Buchstaben findet. Das Problem scheint darin zu liegen, dass akzentuierte Zeichen als Wortgrenzen interpretiert werden. Tatsächlich scheint es, dassWie kann ich einen regulären Ausdruck erstellen, der akzentuierte Zeichen berücksichtigt?

eine Wortgrenze („\ b“) ist ein Punkt zwischen zwei Zeichen, die ein „\ w“ auf einer Seite davon und ein „\ W“ auf den andere haben Seite (in beliebiger Reihenfolge), Zählen der imaginären Zeichen aus den Anfang und das Ende der Zeichenfolge als passend zu einem "\ W". AS3 RegExp to match words with boundry type characters in them

Und da

\ w entspricht jede alphanumerical Zeichen (Wort-Zeichen) einschließlich Striche (kurz für [a-zA-Z0-9_]). \ W entspricht jedem Nicht-Wortzeichen (kurz für [^ a-zA-Z0-9_]) http://www.javascriptkit.com/javatutors/redev2.shtml

offensichtlich akzentuierte Zeichen nicht berücksichtigt werden. Dies wird zu einem Problem mit Wörtern wie Montréal. Wenn é als Wortgrenze betrachtet wird, ist al ein aus zwei Buchstaben bestehendes Wort. Ich habe versucht, meine eigene Definition einer Wortgrenze zu machen, die akzentuierte Zeichen erlauben würde, aber das Sehen als eine Wortgrenze ist nicht einmal ein Zeichen, ich weiß nicht genau, wie man es findet.

Irgendwelche Hilfe?

Hier ist der relevante Code JavaScript, die userInput sucht und findet zwei-Buchstaben-Wörter, die re_state regulären Ausdruck:

var re_state = new RegExp("\\b([a-z]{2})[,]?\\b", "mi"); 
var match_state = re_state.exec(userInput); 
document.getElementById("state").value = (match_state)?match_state[1]:""; 

Antwort

-3

Haben Sie JavaScript eingestellt Nicht-ASCII zu benutzen? Hier ist eine Seite , die JavaScript-UTF-8 zu verwenden, schlägt Einstellung: http://blogs.oracle.com/shankar/entry/how_to_handle_utf_8

Dort heißt es:

ein Attribut charset hinzufügen (charset = "UTF-8"), um Ihr Script-Tags in der übergeordneten Seite:

script type="text/javascript" src="[path]/myscript.js" charset="utf-8" 
+0

das nichts geändert hat ... – Shawn

+0

Ja, das type-Attribut ist nicht einmal in HTML5, wie es isn Es wird nicht von Browsern unterstützt, es ist ein Fehler, den Leute gemacht haben, wenn sie die Spezifikation interpretieren. Das Charset-Meta-Tag funktioniert, aber Zeichen in Links ist keine echte Sache. –

+0

@Rich Bradshaw: Ich habe in meinem Kopfabschnitt. Meinst Du das? – Shawn

4

Während JavaScript reguläre Ausdrücke erkennen nicht-ASCII-Zeichen in einigen Fällen (wie \s), es ist hoffnungslos unzureichend, wenn es um \w und \b geht. Wenn Sie möchten, dass sie mit anderen als den ASCII-Zeichen arbeiten, müssen Sie entweder eine andere Sprache verwenden oder Steve Levithans XRegExp-Bibliothek mit der Unicode plugin installieren.

Übrigens gibt es einen Fehler in Ihrer Regex.Sie haben eine \b nach dem optionalen Komma, aber es sollte vor sein:

"\\b([a-z]{2})\\b,?" 

ich auch die eckigen Klammern entfernt; Sie würden nur solche brauchen, wenn das Komma in Regexen eine besondere Bedeutung hätte, was nicht der Fall ist. Aber ich vermute, dass du das Komma überhaupt nicht anpassen musst; \b sollte ausreichen, um sicherzustellen, dass Sie am Ende des Wortes sind. Und wenn Sie das Komma nicht benötigen, brauchen Sie nicht die Erfassungsgruppe entweder:

"\\b[a-z]{2}\\b" 
+0

@Alan Moore: Was ist der Unterschied zwischen der Verwendung des Literals und des Konstruktors? Der Unterschied, den ich gefunden habe, ist, dass ich, wenn ich den Konstruktor verwende, die Übereinstimmungen von früheren regulären Ausdrücken zu meinem regulären Ausdruck hinzufügen kann. Beispiel: var re_address = new RegExp (match_buildingNumber [0] + match_street [0] + match_city [0] + "?", "mi"); Diese Art von Sache, die zu meinem knowledge ist, unmöglich mit einem regexp Literal ... – Shawn

+0

Okay, wenn Sie einen guten Grund haben, den Konstruktor zu verwenden, verwenden Sie ihn auf jeden Fall. Ich wollte nur sicherstellen, dass Sie die regex-literale Option kennen. –

+0

@Alan Moore: ok danke! Aber ich bin immer noch ein bisschen neugierig. Was ist der Unterschied zwischen den beiden? Warum sollte man das Literal möglichst verwenden? Außerdem habe ich XRegExp und das Unicode-Plugin heruntergeladen, aber ich sehe immer noch nicht, wie ich es für das verwenden soll, was ich möchte. Ich nehme an, da wäre irgendwo ein Lm (modifizierter Brief)? – Shawn