为什么正则表达式“贪婪”模式不起作用
Why doesn't the RegExp "greedy" mode work?
我不明白这种行为。我有这样的例子,需要捕获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
<!--[.]*-->
和<!--.*-->
的意思相同
这是不正确的。
括号[]
表示字符类,其中类中的任何字符都可以匹配。 [.]
是包含".
"字符的字符类。与此形成对比 .
,这是一个预定义的字符类,表示"任何字符"(行终止符除外(。
因此,您与<!--[.]*-->
匹配的要么是空注释,要么是完全由".
"字符组成的注释。您与<!--.*-->
匹配的要么是空注释,要么是填充除换行符以外的任何字符的注释。
第一个不是,因为它的意思不一样。 第一种表示匹配句点字符。 句点字符在放入 [] 集内时不是通用匹配项。 (如果你仔细想想,这是有道理的:你为什么要匹配一组有限匹配变量中的任何内容(
- Ajax模式下的Jquery Select2 V4在IE9中不起作用
- Angular$scope在模式窗口内不起作用
- jQuery日期选择器在Codeigniter和Bootsrap模式表单中不起作用
- 猫鼬混合模式不起作用
- 火狐浏览器 iframe 设计模式不起作用
- 简单的模式不起作用
- JavaScript 模块模式不起作用
- 匹配模式不起作用
- 我的正则表达式模式不起作用
- 在页面加载时启动引导模式不起作用
- 电话差距 - 将 css 更改为离线模式不起作用
- Ionic javascript data-dismiss引导模式不起作用
- 将html附加到引导模式不起作用
- 调用show/hide时引导模式不起作用
- 实体化css模式不起作用
- 为什么正则表达式“贪婪”模式不起作用
- 谷歌地图多地图引导模式不起作用
- Js搜索模式不起作用
- 引导关闭模式不起作用
- 滑块中心模式不起作用