2013-07-25 41 views
20

Nelle espressioni regolari di seguito, \s denota un carattere di spazio. Immagino il parser regex, sta attraversando la stringa e vede \ e sa che il prossimo carattere è speciale.Perché i costruttori di espressioni regolari devono essere sottoposti a doppio escape?

Ma questo non è il caso in quanto sono richieste doppie fughe.

Perché è questo?

var res = new RegExp('(\\s|^)' + foo).test(moo); 

C'è un esempio concreto di come un singolo fuga potrebbe essere mis-interpretata come qualcosa di diverso?

+0

Ricordate, non è necessario che Java o il costruttore di Regexp abbiano bisogno di chiarimenti, è il compilatore (o il parser). – GJK

+1

Per aggiungere alle risposte già corrette: si noti che se si scrive un valore letterale RegExp in JavaScript, * non * è necessario sfuggire alla barra rovesciata, come si sospetterebbe: '/ (\ s | ^) /' –

risposta

22

Si sta costruendo l'espressione regolare passando una stringa al costruttore RegExp.

È necessario sfuggire allo \ in modo che il letterale stringa possa esprimerlo come dati prima di trasformarlo in un'espressione regolare.

12

All'interno del codice in cui si sta creando una stringa, il backslash è un carattere di escape javascript prima, il che significa che le sequenze di escape come \t, \n, \", ecc saranno tradotti in loro controparte javascript (scheda, nuova riga, preventivo, ecc.), e questo sarà reso parte della stringa. Il doppio backslash rappresenta una singola barra rovesciata nella stringa vera e propria, quindi se vuoi una barra rovesciata nella stringa, la prima cosa da evitare.

Quindi, quando si genera una stringa dicendo var someString = '(\\s|^)', cosa si sta realmente facendo è la creazione di una stringa effettiva con il valore (\s|^).

3

Il Regex richiede una rappresentazione di stringa di \s, che in JavaScript può essere prodotta utilizzando il valore letterale "\\s".

Ecco un esempio dal vivo per illustrare il motivo per cui "\s" non è sufficiente:

alert("One backslash:   \s\nDouble backslashes: \\s");

Si noti come un extra \ prima \s cambia l'uscita.

3

\ viene utilizzato in String per evitare caratteri speciali. Se vuoi una barra rovesciata nella tua stringa (ad esempio per \ in \ s) devi sfuggirla tramite una barra rovesciata. Quindi \ diventa \\.

EDIT: Anche dovuto farlo qui, perché \\ nella mia risposta si è rivolto a \.

Problemi correlati