为什么正则表达式“贪婪”模式不起作用

Why doesn't the RegExp "greedy" mode work?

本文关键字:模式 不起作用 贪婪 正则表达式 为什么      更新时间:2023-09-26

我不明白这种行为。我有这样的例子,需要捕获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 = /<!--['s'S]*-->/g;
alert(str.match(regex3));         // <!--Mycommentstest-->
alert(str.match(regex4));         // <!-- My comment test -->

因此,可以使用有限的匹配变量来匹配任何内容。那么应该使用哪种方式来正确使用正则表达式呢?有[]还是没有他们?无法获得差异,两者都给出了正确的输出。

点(.(在字符类中不表示"任何东西"。为什么需要一个角色类来匹配任何东西?

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

但是/<!--.*-->/也不起作用,因为.与换行符不匹配。 在大多数正则表达式风格中,您将使用单行模式让点匹配所有字符,包括换行符例如:/<!--.*-->/s或这个:(?s)<!--.*-->。 但是JavaScript不支持这个功能,所以大多数人使用['s'S]代替,意思是"任何空格字符或任何不是空格的字符" - 换句话说,任何字符。

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

var regex5 = /<!--['s'S]*?-->/g;

RegExpressions <!--[.]*--><!--.*--> 的意思相同

这是不正确的。

括号[]表示字符类,其中类中的任何字符都可以匹配。 [.]是包含"."字符的字符类。与此形成对比 . ,这是一个预定义的字符类,表示"任何字符"(行终止符除外(。

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

第一个不是,因为它的意思不一样。 第一种表示匹配句点字符。 句点字符在放入 [] 集内时不是通用匹配项。 (如果你仔细想想,这是有道理的:你为什么要匹配一组有限匹配变量中的任何内容(