2012-02-17 19 views
6

Ho trovato questo codice regex che trova i commenti nella pagina CSS grammar di w3.org.Spiegare regex che trova i commenti CSS

\/\*[^*]*\*+([^/*][^*]*\*+)*\/ 

è abbastanza lunga e un po 'difficile da capire. Avevo appena messo

\/\*.*\*\/ 

per i commenti, ma quando ho provato a RegexPal trova commenti a linea singola e non commenti multi-linea, mentre l'espressione regolare originale possono trovare tutti i tipi di commenti.

Non capisco che cosa fa la parte

+([^/*][^*]*\*+)* 

all'interno del regex originale. Qualcuno può spiegarmi questo?

+2

[Regular Expression Analyzer] (http://xenon.stanford.edu/~xusch/regexp/analyzer.html) – kev

+0

@Kev: ottimo collegamento, grazie! –

+0

@kev Questo link mi sarà molto utile in futuro .. Grazie mille. :) – Vigneshwaran

risposta

6

La ragione per la vostra trova commenta unica linea singola è che, nelle espressioni tipiche regolari, . corrisponde nulla tranne newlines; mentre l'altro usa una classe di caratteri negata che corrisponde a qualsiasi cosa tranne i caratteri specificati, e quindi può corrispondere alle nuove linee.

Tuttavia, se si dovesse risolvere che (di solito c'è un'opzione per multilinea o "come se singola riga" matching), si dovrebbe trovare che sarebbe partita dal /* del primo commento alla */ dell'ultimo commento ; dovresti utilizzare un quantificatore non avido , .*?, per non più di un commento.

Tuttavia, l'espressione regolare più complessa che date è anche più complessa di quella. Sulla base della risposta di nikc.org, credo che sia quello di far rispettare la restrizione secondo cui "i commenti non possono essere annidati"; cioè, non devono contenere /* all'interno di essi. In altre lingue che consentono i commenti /* like /* this */ (ovvero, un/* interno non è né vietato né un commento nidificato), il modello \/\*.*?\*\/ sarebbe appropriato per abbinarli.

15

Token da spiegazione token:

\/ <- an escaped '/', matches '/' 
\* <- an escaped '*', matches '*' 
[^*]* <- a negated character class with quantifier, matches anything but '*' zero or more times 
\*+ <- an escaped '*' with quantifier, matches '*' once or more 
( <- beginning of group 
[^/*] <- negated character class, matches anything but '/' or '*' once 
[^*]* <- negated character class with quantifier, matches anything but '*' zero or more times 
\*+ <- escaped '*' with quantifier, matches '*' once or more 
)* <- end of group with quantifier, matches group zero or more times 
\/ <- an escaped '/', matches '/' 

Regex Reference

Analysis on Regexper.com

+1

ama la suddivisione di ciò che ciascuna parte significa, non capisci questo spesso – peroija