JavaScript Regexp und Grenzen
-
24-10-2019 - |
Frage
Ein Kollege fragte mich nach einem regelmäßigen Ausdrucksproblem, und ich kann nicht für ihn zu finden und zu antworten.
Wir verwenden Grenzen, um bestimmte Textlängen in einem Texteditor hervorzuheben, aber hier ist ein Beispielcode, der das Problem anzeigt:
<script type="text/javascript">
var str = "Alpha , Beta, Gamma Delta Epsilon, AAlphaa, Beta Alpha<br/>";
var rx = new RegExp('\bAlpha\b','gim');
document.write(str.replace(/\b(Alpha)\b/gim, '-- $1 --'));
document.write(str.replace(rx, '== $1 =='));
</script>
Das Problem ist, dass die erste buchstäbliche Str. -Replace funktioniert, die Regexp -Option jedoch nicht.
Ich habe das gleiche Verhalten in IE und FF, weiß jemand warum?
Lösung
Ich vermute, dass es nicht funktioniert, weil Sie den Backslashes in Ihrer Saite entkommen müssen, die Sie an Regexp übergeben. Du hast das:
var rx = new RegExp('\bAlpha\b','gim');
Du brauchst das:
var rx = new RegExp('\\bAlpha\\b','gim');
Die Zeichenfolge, die Sie an Regexp übergeben haben \b
ist die Escape -Sequenz, um einen Rückenraum in eine Zeichenfolge einzuführen. Sie müssen jedem Backslash mit einem anderen Backslash entkommen.
Andere Tipps
Regexp muss den Fluchtcharakter entkommen lassen:
new RegExp('\\bAlpha\\b')
Dies ist ein String -Problem. \b
In einem Streichliteral ist ein Rückenraum!
RegExp('\\bAlpha\\b','gim');
wäre die richtige Form
Es gibt zwei Möglichkeiten, Ihre regulären Ausdrücke in JavaScript zu schreiben
- wörtlich
- Regexp -Objekt
Auf wörtliche Weise verwenden Sie, wie Sie in Ihrem Lehrbuch, z. B. Balabala / aber im Regexp -Objekt, gelernt haben. Der reguläre Ausdruck wird als Zeichenfolge geschrieben.
Probieren Sie die folgenden Codes aus, Sie wissen, was String in JavaScript verhält.
alert("O\K");
alert("O\\K");
Es gibt eine andere Gelegenheit, wenn Regexp in einem Textbereich oder Eingabefeld geschrieben wurde. Zum Beispiel,
http://www.pagecolumn.com/tool/regtest.htm
In diesem Fall muss in Regexp nicht entkommen werden.
In der Tat müssen Sie alles in der Saite zurücklösen, die an die übergeben wurden Regexp Konstrukteur :
var re = /my_([\w_]+-\d-)regexp/
ist äquivalent zu :
var re = new RegExp("my_\(\[\\\w_\]+-\\\d-\)regexp")
Und beide passen dem folgenden dummen Beispiel an:
"my_very_obvious-4-regexp".match(re)
["my_very_obvious-4-regexp", "very_obvious-4-"]