我正在通过 learncodethehardway's regular expression courses。
一个匹配条件是[A-Za-z]+?
作者解释说,通过添加?
,此匹配条件将是“非贪婪的”。
但是,我认为以下两个是等效的。如果我用它来解析字符串,它不应该总是产生相同的输出吗?
[A-Za-z]+?
[A-Za-z]+
我说错了吗?
答案 0 :(得分:4)
实际上,不是他们不一样。如果包含“?”,它将尽可能匹配FEW字符。这是一个例子:
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 = '<abcdefg>sldkfjsldkj>';
alert(string.match(/<.+>/));
你可以看到它匹配所有东西。但是,使用“?”时,它只会匹配第一个“&gt;”。
var string = '<abcdefg>sldkfjsldkj>';
alert(string.match(/<.+?>/));
现在是时候举一个实际例子说明为什么我们需要“?”符号。假设我想匹配<strong>
HTML标记之间的所有内容:
var string = '<strong>I\'m strong<\/strong> I\'m not strong <strong> I am again.<\/strong>';
alert(string.match(/<strong>[\s\S]+<\/strong>/));
如您所见,在第一个和最后一个<strong>
标记之间匹配了所有内容。只匹配一个,使用救生“?”再次符号:
var string = '<strong>I\'m strong<\/strong> I\'m not strong <strong> I am again.<\/strong>';
alert(string.match(/<strong>[\s\S]+?<\/strong>/));