2013-05-15 14 views
6

Sto utilizzando uno schema regolare che ho ricevuto da regexlib per convalidare gli url relativi. Sul loro sito è possibile il modello test per assicurarsi che soddisfi le vostre esigenze. Tutto funziona alla grande sul loro sito, non appena io uso il modello nel mio ottengo il messaggio di errore:L'espressione regolare JavaScript non è valida nella classe di caratteri

gamma non valida nella classe di caratteri

So che questo errore di solito significa che un trattino è viene erroneamente utilizzato per rappresentare un intervallo e non è correttamente scappato. Ma in questo caso dal momento che funziona sul loro sito sono confuso perché non sta lavorando sul mio.

var urlRegex = new RegExp('^(?:(?:\.\./)|/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$', 'g'); 

NOTA: Se avete intenzione di testare la regex dal loro sito (utilizzando il link qui sotto) assicurarsi di cambiare il Regex Engine discesa per Client-side Engine e il Engine discesa per Javascript.

risposta

10

possibile mettere - alla fine o inizio della classe di caratteri o uso due backslash di fare una fuga regex all'interno stringa

dal momento che si sta utilizzando stringa è necessario utilizzare due backslash per ogni carattere speciale ..


NOTA

Partenza this risposta su SO che spiega quando utilizzare backslash singole o doppie per sfuggire caratteri speciali

+0

ho spostato fino alla fine in entrambe le classi di personaggi, ma ora ho 'quantifier' valido – bflemi3

+0

non potrei anche raddoppiare sfuggire il trattino es (' \\ -') invece di spostarlo fino alla fine? – bflemi3

+0

@ bflemi3 sì, infatti, puoi sfuggirti.scopri il link che ho specificato in ans – Anirudha

4

v'è alcun motivo per usare RegExp costruttore qui. Basta usare RegExp letterale:

var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g; 
      ^  ^^               ^                     ^

All'interno RegExp letterale, basta scrivere l'espressione regolare, naturalmente, ad eccezione di /, che ora ha bisogno di fuga, dal momento che / viene utilizzato come delimitatore nel RegExp letterale.

In classe di caratteri, ^ ha significato speciale all'inizio della classe di caratteri, - ha un significato speciale tra 2 caratteri e \ ha un significato speciale, che è sfuggire altri caratteri (principalmente ^, -, [, ] e \) e anche per specificare classi di caratteri di stenografia (\d, \s, \w, ...). [, ] vengono utilizzati come delimitatori per la classe di caratteri, quindi hanno anche un significato speciale. (In realtà, in JavaScript, solo ] ha un significato speciale ed è possibile specificare [ senza eseguire l'escape nella classe di caratteri). Oltre ai 5 caratteri sopra elencati, altri caratteri (a meno che non siano coinvolti in una sequenza di escape con \) non hanno alcun significato speciale.

È possibile ridurre il numero di escape \ con le informazioni di cui sopra. Per ^, a meno che non sia l'unico carattere nella classe di caratteri, puoi metterlo via dall'inizio della classe di caratteri. Per -, puoi metterlo alla fine della classe di caratteri.

var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g; 

Cosa è stato cambiato:

[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]] 
[\w`~!$=;+.^()|{}\[\]-] 
Problemi correlati