正则表达式(。*?)和(。*)之间有什么区别?

时间:2012-12-04 14:45:45

标签: regex

我已经做了一段时间的正则表达式,但我不是关于特定规则的细微之处的专家,我总是(.*?)进行匹配,但有限制,就像我理解的那样会阻止它获得的第一次机会,而(.*)?会继续并且更加贪婪。

但我没有真正的理由为什么我这么想,我只是想到它,因为我曾经读过它。

现在我想知道,有区别吗?如果是的话,它是什么......

4 个答案:

答案 0 :(得分:12)

(.*?)是一个包含非贪婪匹配的组。

(.*)?是一个包含贪婪匹配的可选组。

答案 1 :(得分:6)

其他人指出了贪婪和不贪婪的比赛之间的区别。以下是您在实践中可以看到的不同结果的示例。由于正则表达式通常嵌入在宿主语言中,因此我将使用Perl作为主机。在Perl中,括号中的匹配将这些匹配的结果分配给特殊变量。因此,在这种情况下,匹配可能是相同的,但分配给这些变量的可能不是:

例如,假设你的匹配字符串是'hello'。两种模式都匹配,但匹配的部分($ 1)不同:

'hello' =~ /(.*?)l/;
# $1 == 'he' 

'hello' =~ /(.*)?l/;
# $1 == 'hel'

答案 2 :(得分:5)

因为*表示“零或更多”,所以这一切都有点令人困惑。两个?都是完全不同的,可以用不同的例子更清楚地显示出来:

如果您提供fo*?,则

f仅匹配foo。也就是说,这个?使得匹配不贪婪。删除它会使其与foo匹配。

fo?将与f匹配,但也会与fo匹配。也就是说,此?使匹配成为可选:它应用的部分(在这种情况下只有o)必须存在0或1次。删除它会使匹配成为必需:它必须只出现一次,因此只有fo仍然匹配。

虽然我们在regexp中的?有不同的含义,但还有一个:紧跟?之后的(是几个特殊操作的前缀,例如环视。也就是说,它的含义与你提出的任何内容都不一样。

答案 3 :(得分:3)

?有不同的含义。

  1. 当它跟随一个字符或一个组时,它是一个量词,匹配前一个构造的0或1次出现。 See here for details

  2. 当它跟随量词时,它会修改该量词的匹配行为,使其与lazy / ungreedy匹配。 See here for details