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

Chr*_*mas 12 regex

我已经做了一段时间的正则表达式,但我不是关于特定规则的微妙之处的专家,我总是做(.*?)匹配,但有限制,因为我知道它会阻止它的第一次机会,然而(.*)?会继续并且更加贪婪.

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

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

SLa*_*aks 12

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

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

  • 并且可选的`?`没有实际价值,因为`.*`是零或更多...... (4认同)
  • 你能解释贪婪和非贪婪之间的区别吗? (2认同)

Ron*_*ell 7

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

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

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

'hello' =~ /(.*)?l/;
# $1 == 'hel'
Run Code Online (Sandbox Code Playgroud)


ste*_*ema 5

具有?不同的含义。

  1. 当它跟在一个字符或一个组后面时,它是一个量词,与前面的构造的 0 或 1 次匹配匹配。详情请参阅此处

  2. 当它跟随一个量词时,它会修改该量词的匹配行为,使其匹配惰性/不贪婪。详情请参阅此处


Bas*_*nen 5

因为*意味着"零或更多",所有这一切都会让人感到有些困惑.两者?都是完全不同的,可以通过每个的不同示例更清楚地显示:

fo*?f在您提供时才匹配foo.也就是说,这?使得比赛不贪婪.删除它使它匹配foo.

fo?会匹配f,但也fo.也就是说,这?使匹配成为可选:它适用的部分(仅在这种情况下o)必须存在0或1次.删除它需要匹配:它必须只出现一次,所以只能fo匹配.

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