2016-04-28 12 views
5

Sto studiando circa RegExp ma ovunque posso vedere due sintassiJavaScript: RegExp costruttore vs RegEx letterale

new RegExp("[abc]") 

E

/[abc]/ 

E se con i modificatori allora che cosa è l'uso di barra aggiuntiva (\)

/\[abc]/g 

non ricevo alcun bug con questi due, ma io WonD er c'è qualche differenza tra questi due. Se sì, allora che cos'è e che è meglio usare?

Mi sono riferito a Differences between Javascript regexp literal and constructor ma non ho trovato la spiegazione di quale sia il migliore e qual è la differenza.

+1

Si noti che '/ \ [abc]/G' corrisponderà' [abc] 'perché prima staffa è sfuggito. Questo è completamente diverso da 'new RegExp (" [abc] ")' e '/ [abc] /'. – Tushar

+0

si lo so '/ \ [abc]/g' ho detto questo per sapere perché dobbiamo usare extra' \ 'se stiamo usando i modificatori –

+1

No, non ce n'è bisogno. Puoi aggiungere modificatori dopo l'ultimo '/' ad es. '/ [abc]/gi' – Tushar

risposta

9

La differenza chiave è che letterale REGEX non può accettare input dinamico, cioè da variabili, mentre il costruttore può, perché il modello è specificato come stringa.

detto che volevi per abbinare una o più parole da una matrice in una stringa:

var words = ['foo', 'bar', 'orange', 'platypus']; 
var str = "Foo something nice orange what a lovely platypus"; 
str.match(new RegExp('\\b('+words.join('|')+')\\b')); 

questo non sarebbe possibile con un letterale /pattern/, come qualcosa tra i due slash viene interpretata letteralmente.

Nota anche la necessità di caratteri di escape doppia (ovvero \\) quando si specificano i pattern in questo modo, perché lo facciamo in una stringa: la prima barra retroversa deve essere preceduta da escape dal secondo in modo che uno di essi lo renda nel modello. Se ce ne fosse solo uno, sarebbe interpretato dall'analizzatore di stringhe di JS come carattere di escape e rimosso.

+1

Ma tieni presente che la sintassi letterale è solo una volta, con il codice JS, mentre il 'nuovo modulo Regexp()' deve compilare l'espressione regolare ogni volta che viene chiamato - quindi le prestazioni saranno migliori con la versione letterale: Usalo quando possibile! – Doin

+0

Certo, ma qui un letterale non è possibile in quanto non è dinamico (almeno senza usare 'eval()'.) – Utkanos

6
  1. Come si può vedere, la sintassi RegExp costruttore richiede stringa da passare. \ nella stringa viene utilizzato per sfuggire al seguente carattere. Così,

    new RegExp("\s") // This gives the regex `/s/` since s is escaped. 
    

    produrrà la regex s.

    Nota: per aggiungere modificatori/flag, passare i flag come secondo parametro alla funzione di costruzione.

    Mentre, /\s/ - la sintassi letterale, produrrà la regex che è prevedibile.

  2. La sintassi del costruttore RegExp consente di creare espressioni regolari da dinamicamente.

Così, quando ha bisogno di essere realizzato in modo dinamico la regex, utilizzare la sintassi RegExp costruttore altrimenti utilizzare la sintassi letterale regex.

+0

perché la tua risposta è contrassegnata come wiki della comunità? –

+1

@KhalidHussain Penso che questo possa essere reso più canonico, altri possono anche modificarlo per renderlo più utile. – Tushar

0

Esistono due modi per definire le espressioni regolari.

  1. Attraverso un costruttore di oggetto
    • può essere modificata in fase di esecuzione.
  2. Attraverso un letterale.
    • compilata al carico dello script
    • Migliore prestazione

Il letterale è il migliore da usare con note le espressioni regolari, mentre il costruttore è meglio per le espressioni regolari costruiti in modo dinamico, come quelli dall'input dell'utente.

è possibile utilizzare uno dei due e saranno trattati esattamente allo stesso modo ..

+2

"Attraverso un letterale" la sezione non è corretta - questi sono solo miti che sono, purtroppo, estremamente popolari. I motori JS non fanno distinzioni a livello di esecuzione tra quelli. Indipendentemente dal modo in cui la creazione di RegExp è stata scritta nel codice (sia tramite syntax sugar o global constructor), il codice emesso è lo stesso e regexp è compilato pigramente al suo primo utilizzo. – RReverser

+0

@RReverser - MDN dice il contrario, anche se accetto che i documenti potrebbero non essere stati scritti dai programmatori. https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions – mwardm