2013-03-17 23 views
7

Sto tentando di commentare le espressioni regolari in JavaScript.Commentando le espressioni regolari

Sembra esserci molte risorse su come rimuovere commenti dal codice usando espressioni regolari, ma in realtà non come commento espressioni regolari in JavaScript in modo che siano più facili da capire.

Qualsiasi aiuto è molto apprezzato!

+0

Se stai cercando [qualcosa come il modificatore '/ x' di Perl] (http://stackoverflow.com/q/632795/139010), non c'è nulla di simile in JavaScript. –

+2

Interessante domanda. Ho diviso la mia espressione regolare in stringhe e ho commentato le stringhe, quindi le ho concatenate nel RegExp. Mi piacerebbe sapere di meglio. –

risposta

10

Sfortunatamente, JavaScript non ha una modalità dettagliata per i valori letterali di espressioni regolari come fanno altri langauges. È possibile trovare this interesting, though.

Al posto di librerie esterne, la soluzione migliore è solo per usare una stringa normale e commentare che:

var r = new RegExp(
    '('  + //start capture 
    '[0-9]+' + // match digit 
    ')'  //end capture 
); 
r.test('9'); //true 
+0

Interessante, ma il limite ovvio è che non ti consente di costruire valori letterali regex. –

+1

Cosa si può ottenere con espressioni regex letterali che non è possibile ottenere con la "nuova sintassi RegExp()"? – plemarquand

+3

@plemarquand Escaping diventa un dolore. Quando incorpori una lingua in una stringa, devi essere attento ai suoi caratteri speciali. Ad esempio, '/ s \/\ d + /' diventa ''s \\/\\ d +''. Per questo motivo, devi stare attento quando costruisci in modo dinamico. Fondamentalmente, lo stesso problema che hai sul lato server con la zuppa di lingua. – Zirak

1

Ti suggerisco di inserire un commento regolare sopra la linea con l'espressione regolare per spiegarlo.

Avrete molta più libertà.

+1

In che modo un commento regolare sopra la linea può aiutare in questo caso: '(?: [A-z0-9! # $% & '* +/=?^_' {|} ~ -] + (?: \ . [a-z0-9 # $% & '* +/=^_ '{|} ~ -!?] +) * |" (:? [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f ?? \ x21 \ x23- \ X5b \ x5d- \ x7F] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7F]) * ") @ (: (: [a-z0-9] (:? [a-z0-9 -] * [a-z0-9])?. \) + [a-z0-9] (:? [a-z0-9 -] * [a-z0-9 ]) |? \ [(:(?: 25 [0-5?] | 2 [0-4] [0-9] |?? [01] [0-9] [0-9]) \). {3} (?: 25 [0-5] | 2 [0-4] [0-9] | [01] [0-9] [0-9] |?? [a-z0-9 -] * [a-z0-9]: (:? [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21- \ X5a \ x53- \ x7F] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) +) \]) $ Questa è la regex per email –

+0

Hai inserito un commento su più righe sopra. E lo spieghi chunk per chunk (come suggerisce Explosion Pills, ma sopra. È molto più comodo se hai bisogno di modificare il reg ex.). – Jean

+4

@BenjaminGruenbaum Sapete che [la vostra espressione regolare per email è probabilmente errata] (http://davidcel.is/blog/2012/09/06/stop-validating-email-addresses-with-regex/), giusto? –

3

In molte altre lingue (in particolare Perl), c'è lo speciale x bandiera. Quando è impostato, l'espressione regolare ignora eventuali spazi bianchi e commenti al suo interno. Purtroppo, le espressioni regolari in javascript non supportano il flag x.

Mancanza di sintassi, l'unico modo per sfruttare la leggibilità è la convenzione. Il mio è quello di aggiungere un commento prima della difficile espressione regolare, contenendolo come se si avesse la x flag. Esempio:

/* 
    \+?  #optional + sign 
    (\d*) #the integeric part 
    (  #begin decimal portion 
    \. 
    \d+ #decimal part 
) 
*/ 
var re = /\+?(\d*)(\.\d+)/; 

Per esempi più complessi, si può vedere quello che ho fatto con la tecnica here e here.

+1

+1 per '#read sopra, non sto ripetendo questa merda '(sì, qualcuno segue i tuoi link). –