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é?

È stato utile?

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

Ci sono 2 modi per scrivere le espressioni regolari in Javascript

  1. letterale
  2. 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-"]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top