解释发现CSS注释的正则表达式

时间:2012-02-17 13:58:40

标签: css regex

我发现这个正则表达式代码在w3.org的CSS grammar页面中找到了评论。

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

这很长很难理解。我只是把

\/\*.*\*\/

查找评论,但是当我在RegexPal中测试时,它会找到单行注释而不是多行注释,而原始正则表达式可以找到所有类型的注释。

我不明白是什么

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

部分在原始正则表达式中。谁能解释一下这个?

2 个答案:

答案 0 :(得分:15)

令牌解释令牌:

\/    <- 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 :(得分:6)

您的原因只发现单行注释,在典型的正则表达式中,.匹配除了换行符之外的任何 ;而另一个使用一个否定的字符类,它匹配除指定字符之外的任何字符,因此可以匹配换行符。

但是,如果您要解决这个问题(通常选择多线或&#34;就像单线&#34;匹配一样),您会发现它与{{1}匹配对最后一条评论的/*的第一条评论;您必须使用非贪婪量词*/来匹配不超过一条评论。

但是,您提供的更复杂的正则表达式甚至比这更复杂。根据nikc.org的回答,我认为应该强制执行“评论可能不会嵌套”的限制;也就是说,它们不得包含.*?。在允许注释/*的其他语言中(即,内部/ *既不被禁止也不是嵌套注释),模式/* like /* this */将适合于匹配它们。