我已经做了一段时间的正则表达式,但我不是关于特定规则的细微之处的专家,我总是(.*?)
进行匹配,但有限制,就像我理解的那样会阻止它获得的第一次机会,而(.*)?
会继续并且更加贪婪。
但我没有真正的理由为什么我这么想,我只是想到它,因为我曾经读过它。
现在我想知道,有区别吗?如果是的话,它是什么......
答案 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)
?
有不同的含义。
当它跟随一个字符或一个组时,它是一个量词,匹配前一个构造的0或1次出现。 See here for details
当它跟随量词时,它会修改该量词的匹配行为,使其与lazy / ungreedy匹配。 See here for details