正则表达式?

时间:2014-12-14 01:36:54

标签: regex

我正在通过 learncodethehardway's regular expression courses

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

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

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

[A-Za-z]+?

[A-Za-z]+

我说错了吗?

1 个答案:

答案 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>/));