0

我不明白这种行为。我有这样的例子,需要捕捉 html 评论。

var str = '.. <!--My -- comment test--> ';

var regex1 = /<!--[.]*-->/g;
var regex2 = /<!--.*-->/g;

alert(str.match(regex1));      // null
alert(str.match(regex2));      // <!--My -- comment test--> 

第二个正则表达式regex2工作正常,准确输出所需内容。首秀null。而且我不明白其中的区别。正则表达式<!--[.]*--><!--.*-->含义相同 - “在<!--将除换行符之外的任何字符从 0 到尽可能多并以-->”结尾之后。但是对于第二个它有效,而对于第一个则无效。为什么?

UPD。我已阅读评论并有更新。

var str3 = '.. <!--Mycommenttest--> ';
var str4 = '.. <!--My comment test--> ';

var regex3 = /<!--[\w]*-->/g;
var regex4 = /<!--[\s\S]*-->/g;

alert(str.match(regex3));         // <!--Mycommentstest-->
alert(str.match(regex4));         // <!-- My comment test -->

所以可以使用有限的匹配变量来匹配任何东西。那么应该使用哪种方式正确使用 RegExps 呢?有[]没有他们?无法区分,两者都给出正确的输出。

4

4 回答 4

5

点 ( .) 并不表示字符类中的“任何东西”。为什么你需要一个字符类来匹配任何东西?

于 2012-02-03T17:48:15.190 回答
3

正则表达式<!--[.]*--><!--.*-->意思一样

这是不正确的。

括号[]表示一个字符类,该类中的任何字符都可以匹配。[.]是包含 ' .' 字符的字符类。将此与 进行对比.,这是一个预定义的字符类,用于表示“任何字符”(行终止符除外)。

因此,您匹配的<!--[.]*-->是空评论或完全由 ' .' 字符组成的评论。您匹配的<!--.*-->是空注释或填充除换行符以外的任何字符的注释。

于 2012-02-03T18:22:08.087 回答
3

\w像,\d和的字符类简写\s在字符类内部的含义与 out 完全相同,但是像这样的元字符.通常在字符类内部失去其特殊含义。这就是为什么/<!--[.]*-->/没有按预期工作的原因:[.]匹配文字..

/<!--.*-->/也不是真的有效,因为.不匹配换行符。在大多数正则表达式风格中,您将使用单行模式让点匹配包括换行符在内的所有字符,例如:/<!--.*-->/s或:(?s)<!--.*-->。但是 JavaScript 不支持该功能,因此大多数人使用它[\s\S]来代替,意思是“任何空白字符或任何不是空白的字符”——换句话说,任何字符。

但这也不对,因为(正如 Jason 在他的评论中指出的那样)它会贪婪地匹配从 first<!--到 last的所有内容-->,这可能包含几个单独的评论以及它们之间的所有非评论材料。让它真正正确可能不值得付出努力。当使用正则表达式匹配 HTML 时,无论如何您都必须做出许多简化假设;如果你不能假设一定程度的良好状态,你还不如放弃。在这种情况下,使量词非贪婪就足够了:

var regex5 = /<!--[\s\S]*?-->/g;
于 2012-02-03T22:08:27.820 回答
2

第一个不是,因为它的意思不一样。第一个表示匹配句点字符。当放在 [] 集合中时,句点字符不是通用匹配。(如果您考虑一下,这是有道理的:为什么要匹配一组有限匹配变量中的任何内容)

于 2012-02-03T17:49:30.707 回答