我一直在做正则表达式,但我不是特定规则的微妙之处的专家,我一直在做(.*?)
匹配,但是有限制,因为我知道它会阻止它获得的第一次机会,而(.*)?
会继续并且更加贪婪。
但我没有真正的理由会这样想,我只是因为从前读过它才这么想。
现在我想知道,有区别吗?如果是这样,那是什么...
我一直在做正则表达式,但我不是特定规则的微妙之处的专家,我一直在做(.*?)
匹配,但是有限制,因为我知道它会阻止它获得的第一次机会,而(.*)?
会继续并且更加贪婪。
但我没有真正的理由会这样想,我只是因为从前读过它才这么想。
现在我想知道,有区别吗?如果是这样,那是什么...
(.*?)
是一个包含非贪婪匹配的组。
(.*)?
是一个包含贪婪匹配的可选组。
其他人指出了贪婪匹配和非贪婪匹配之间的区别。这是您在实践中可以看到的不同结果的示例。由于正则表达式通常嵌入在宿主语言中,因此我将使用 Perl 作为宿主。在 Perl 中,将匹配项括在括号中会将这些匹配项的结果分配给特殊变量。因此,在这种情况下,匹配项可能相同,但分配给这些变量的内容可能不同:
例如,假设您的匹配字符串是“hello”。两种模式都会匹配它,但匹配的部分 ($1) 不同:
'hello' =~ /(.*?)l/;
# $1 == 'he'
'hello' =~ /(.*)?l/;
# $1 == 'hel'
因为*
意思是“零或更多”,所以这一切都变得有些混乱。两者?
完全不同,可以通过每个不同的示例更清楚地显示:
fo*?
f
仅当您提供它时才会匹配foo
。也就是说,这?
使得匹配是非贪婪的。删除它使其匹配foo
。
fo?
会匹配f
,而且fo
。也就是说,这?
使得匹配是可选的:它适用的部分(仅在这种情况下o
)必须出现 0 或 1 次。删除它使匹配成为必需:它必须只出现一次,所以 onlyfo
仍然匹配。
虽然我们对 in 正则表达式有不同的含义?
,但还有一个:?
紧跟在 a 之后的 a(
是几个特殊操作的前缀,例如环视。也就是说,它的含义与您所问的任何事情都不一样。