我不明白这种行为。我有这样的例子,需要捕获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
.我不明白其中的区别。RegExpressions <!--[.]*-->
和 <!--.*-->
的意思相同 - "在<!--
之后,除换行符之外的任何字符的数量从 0 到尽可能多的数量并以 -->
结束"。但是对于第二个它有效,对于第一个它不起作用。为什么?
上。我已经阅读了评论并进行了更新。
var str3 = '.. <!--Mycommenttest--> ';
var str4 = '.. <!--My comment test--> ';
var regex3 = /<!--[w]*-->/g;
var regex4 = /<!--[sS]*-->/g;
alert(str.match(regex3)); // <!--Mycommentstest-->
alert(str.match(regex4)); // <!-- My comment test -->
因此,可以使用有限的匹配变量来匹配任何内容。那么应该使用哪种方式来正确使用正则表达式呢?有[]
还是没有他们?无法获得差异,两者都给出了正确的输出。
点(.
(在字符类中不表示"任何东西"。为什么需要一个角色类来匹配任何东西?
字符类的简写,如w
、d
和s
在字符类内部的含义与out完全相同,但像.
这样的元字符通常会在字符类中失去其特殊含义。 这就是为什么/<!--[.]*-->/
没有按预期工作的原因:[.]
匹配文字.
.
但是/<!--.*-->/
也不起作用,因为.
与换行符不匹配。 在大多数正则表达式风格中,您将使用单行模式让点匹配所有字符,包括换行符,例如:/<!--.*-->/s
或这个:(?s)<!--.*-->
。 但是JavaScript不支持这个功能,所以大多数人使用[sS]
代替,意思是"任何空格字符或任何不是空格的字符" - 换句话说,任何字符。
但这也不对,因为(正如 Jason 在他的评论中指出的那样(它会贪婪地匹配从第一个<!--
到最后一个-->
的所有内容,其中可能包括几个单独的评论和它们之间的所有非评论材料。 要使它真正正确可能不值得付出努力。 当使用正则表达式来匹配 HTML 时,无论如何您都必须做出许多简化的假设;如果你不能假设一定程度的良好形式,你还不如放弃。 在这种情况下,使量词不贪婪就足够了:
var regex5 = /<!--[sS]*?-->/g;
RegExpressions
<!--[.]*-->
和<!--.*-->
的意思相同
这是不正确的。
括号[]
表示字符类,其中类中的任何字符都可以匹配。 [.]
是包含".
"字符的字符类。与此形成对比 .
,这是一个预定义的字符类,表示"任何字符"(行终止符除外(。
因此,您与<!--[.]*-->
匹配的要么是空注释,要么是完全由".
"字符组成的注释。您与<!--.*-->
匹配的要么是空注释,要么是填充除换行符以外的任何字符的注释。
第一个不是,因为它的意思不一样。 第一种表示匹配句点字符。 句点字符在放入 [] 集内时不是通用匹配项。 (如果你仔细想想,这是有道理的:你为什么要匹配一组有限匹配变量中的任何内容(