正则表达式 with?

12 浏览
0 Comments

正则表达式 with?

这个问题已经有了答案:

在正则表达式的背景下,“懒惰”和“贪婪”是什么意思?

我正在学习Learn Code the Hard Way的正则表达式课程

其中一个匹配条件是[A-Za-z]+?

作者解释说,通过添加?,此匹配条件将是“非贪婪的”。

然而,我认为以下两个条件是等效的。如果我用它来解析字符串,它不应该总是产生相同的输出吗?

[A-Za-z]+?

[A-Za-z]+

我的观点正确吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

实际上,它们并不相同。如果您包含问号“?”,它将匹配尽可能少的字符。以下是一个示例:

var string = 'abcdefg';
alert(string.match(/[A-Za-z]+/));

var string = 'abcdefg';
alert(string.match(/[A-Za-z]+?/));

现在,问号“?”仍然可以匹配多个字符,但仅在必要时,比如这样:

var string = 'abcdefg>';
alert(string.match(/[A-Za-z]+>/));

现在有点混乱了。请查看以下示例,它不包括问号“?”(点字符匹配除空格或换行符之外的所有内容):

var string = 'sldkfjsldkj>';
alert(string.match(/<.+>/));

您可以看到它匹配了所有内容。然而,带有问号“?”时,它只会匹配到第一个“>”。

var string = 'sldkfjsldkj>';
alert(string.match(/<.+?>/));

现在是一个实际应用问号“?”的例子。假设我想匹配 HTML标记之间的所有内容:

var string = 'I\'m strong<\/strong> I\'m not strong  I am again.<\/strong>';
alert(string.match(/[\s\S]+<\/strong>/));

正如您所看到的,它匹配了第一个和最后一个标记之间的所有内容。要仅匹配一个,请再次使用救命的问号“?”:

var string = 'I\'m strong<\/strong> I\'m not strong  I am again.<\/strong>';
alert(string.match(/[\s\S]+?<\/strong>/));

0