2012-02-17 24 views
6

Encontré este código de expresiones regulares que encuentra comentarios en la página de w3.org CSS grammar.Explicar regex que encuentra comentarios de CSS

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

es bastante largo y un poco difícil de entender. Yo sólo había puesto

\/\*.*\*\/ 

para encontrar comentarios, pero cuando lo probé en RegexPal encuentra solo los comentarios de línea y no los comentarios multilínea mientras que la expresión regular original se puede encontrar todo tipo de comentarios.

No entiendo lo que hace la parte

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

dentro de la expresión regular originales. ¿Alguien puede explicarme esto?

+2

[Analizador de expresiones regulares] (http://xenon.stanford.edu/~xusch/regexp/analyzer.html) – kev

+0

@Kev: excelente enlace, gracias! –

+0

@kev Ese enlace me será muy útil en el futuro ... Muchas gracias. :) – Vigneshwaran

Respuesta

6

La razón por la suya encuentra solamente una sola línea comenta es que, en las expresiones regulares típicos, . concuerda con algo salvo nueva línea,; mientras que el otro usa una clase de caracteres negada que coincide con cualquier cosa que no sean los caracteres especificados, por lo que puede coincidir con las nuevas líneas.

Sin embargo, si se va a arreglar eso (por lo general hay una opción para multilínea o "como si sola línea de" matching), se verá que coincidiría del /* del primer comentario a la */ del último comentario ; Debería utilizar un cuantificador no codicioso, .*?, para que coincida con no más de un comentario.

Sin embargo, la expresión regular más compleja que da es incluso más compleja que eso. Basado en la respuesta de nikc.org, creo que es para hacer cumplir la restricción de que "los comentarios no pueden estar anidados"; es decir, no deben contener /* dentro de ellos. En otros idiomas que permiten los comentarios /* like /* this */ (es decir, un interno/* no está prohibido ni un comentario anidado), el patrón \/\*.*?\*\/ sería apropiado para hacer coincidirlos.

15

simbólico por la explicación del 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 el desglose de lo que significa cada parte, no se obtiene esto a menudo – peroija

Cuestiones relacionadas