Javascript RegExp e confini
-
24-10-2019 - |
Domanda
Un collega mi ha chiesto di un problema delle espressioni regolari, e io non riesco a trovare e risposta per lui.
Stiamo usando i confini per evidenziare alcune lunghezze di testo in un editor di testo, ma ecco alcuni esempi di codice che mostra il problema:
<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>
Il problema è, i primi lavori str.replace letterali, ma l'opzione RegExp non lo fa.
Ho lo stesso comportamento in IE e FF, qualcuno sa perché?
Soluzione
sto cercando di indovinare che non funziona perché è necessario per sfuggire alla backslash nella stringa che si passa a RegExp. Hai questo:
var rx = new RegExp('\bAlpha\b','gim');
Hai bisogno di questo:
var rx = new RegExp('\\bAlpha\\b','gim');
La stringa passato a RegExp ha 2 caratteri backspace in esso, dal momento che \b
è la sequenza di escape per l'inserimento di un backspace in una stringa. Hai bisogno di fuggire ogni barra rovesciata con un altro backslash.
Altri suggerimenti
RegExp ha bisogno di avere il carattere di escape sfuggito:
new RegExp('\\bAlpha\\b')
Questo è un problema di stringa. \b
in un letterale stringa è una backspace!
RegExp('\\bAlpha\\b','gim');
sarebbe la forma corretta ??p>
Ci sono 2 modi per scrivere le espressioni regolari in Javascript
- letterale
- oggetto RegExp
In modo letterale, si utilizza come avete imparato nel vostro libro di testo, per esempio / Balabala / Ma in oggetto RegExp, espressione regolare è scritto come una stringa.
Provare i seguenti codici, si sa che cosa si comporta stringa in JavaScript.
alert("O\K");
alert("O\\K");
C'è un'altra occasione in cui Regexp scritto in una scatola textarea o input. Ad esempio,
http://www.pagecolumn.com/tool/regtest.htm
In questo caso, \ in Regexp non deve essere sfuggito.
In realtà si deve tutto backslash nella stringa passata al RegExp costruttore:
var re = /my_([\w_]+-\d-)regexp/
è equivalente a:
var re = new RegExp("my_\(\[\\\w_\]+-\\\d-\)regexp")
Ed entrambi corrisponde al seguente esempio stupido:
"my_very_obvious-4-regexp".match(re)
["my_very_obvious-4-regexp", "very_obvious-4-"]