2011-06-09 15 views
30

Sono nuovo di Regex e sto provando a lavorarlo in uno dei miei nuovi progetti per vedere se riesco ad apprenderlo e ad aggiungerlo al mio rappresentante di competenze. Comunque, sto colpendo un posto di blocco qui.Javascript + Regex = Niente da ripetere?

Sto cercando di capire se l'input dell'utente ha caratteri non validi in esso utilizzando la funzione .search come così:

if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) { 
    ... 
} 

Tuttavia, quando provo ad eseguire la funzione di questa linea è contenuta, è getta il seguente errore per quella specifica linea:

Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@. 

]/: Nothing to repeat 

non posso per la vita di me vedere che cosa c'è di sbagliato con il mio codice. Qualcuno può indicarmi la giusta direzione?

risposta

50

È necessario raddoppiare i backslash utilizzati per sfuggire ai caratteri speciali dell'espressione regolare. Tuttavia, come sottolinea @Bohemian, la maggior parte di questi backslash non è necessaria. Sfortunatamente, la sua risposta soffre dello stesso problema del tuo. Quello che realmente si desidera è:

Il backslash viene interpretato dal codice che legge la stringa anziché passare al parser di espressioni regolari. Si desidera:

"[\\[\\]?*+|{}\\\\()@.\n\r]" 

Annotare la barra rovesciata quadruplicato. Questo è assolutamente necessario. La stringa passata al compilatore di espressioni regolari è quindi identica alla stringa di @ Bohemian e funziona correttamente.

+3

btw, il quadruplo \ è necessario solo in alcuni langs, ad es. Java sì, perl non – Bohemian

2

In primo luogo, in una classe di caratteri [...]la maggior parte dei caratteri non ha bisogno di essere scappata: sono solo dei letterali.

Così, il vostro regex dovrebbe essere:

"[\[\]?*+|{}\\()@.\n\r]" 

Questo compila per me.

+0

Sì, lo compila ma non funziona correttamente – Icet

+0

@Icet le altre risposte non funzionano per te? In caso contrario, quale input "non funziona"? – Bohemian

+0

Ad esempio, +44 come input non funziona. Questa soluzione funziona bene str.replace (/ [\ - \ [\] \/\ {\} \ (\) \ * \ + \? \. \\\^\ $ \ |]/g, "\\ $ &"); – Icet

4

costruzione al largo di @Bohemian, penso che l'approccio più semplice sarebbe quella di utilizzare solo una regex letterale, ad esempio:

if (name.search(/[\[\]?*+|{}\\()@.\n\r]/) != -1) { 
    // ... stuff ... 
} 

letterali Regex sono bello perché non si dispone di sfuggire il carattere di escape, e alcuni IDE evidenzieranno le espressioni regex non valide (molto utili per me perché le rovino costantemente).