18

我一直在做正则表达式,但我不是特定规则的微妙之处的专家,我一直在做(.*?)匹配,但是有限制,因为我知道它会阻止它获得的第一次机会,而(.*)?会继续并且更加贪婪。

但我没有真正的理由会这样想,我只是因为从前读过它才这么想。

现在我想知道,有区别吗?如果是这样,那是什么...

4

4 回答 4

14

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

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

于 2012-12-04T14:48:10.217 回答
7

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

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

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

'hello' =~ /(.*)?l/;
# $1 == 'hel'
于 2012-12-04T14:48:14.413 回答
5

因为*意思是“零或更多”,所以这一切都变得有些混乱。两者?完全不同,可以通过每个不同的示例更清楚地显示:

fo*?f仅当您提供它时才会匹配foo。也就是说,这?使得匹配是非贪婪的。删除它使其匹配foo

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

虽然我们对 in 正则表达式有不同的含义?,但还有一个:?紧跟在 a 之后的 a(是几个特殊操作的前缀,例如环视。也就是说,它的含义与您所问的任何事情都不一样。

于 2012-12-04T14:58:49.613 回答
5

有不同的?含义。

  1. 当它跟随一个字符或一个组时,它是一个量词,匹配前面构造的 0 次或 1 次出现。详情见这里

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

于 2012-12-04T14:55:34.147 回答