我已经做了一段时间的正则表达式,但是对于特定规则的微妙差别并不是专家级。 我一直使用(.*?)
进行匹配,但有限制条件,因为我理解它会在第一次机会时停止匹配,而(.*)?
会继续匹配且更具贪心性。
但我没有真正的理由认为这样,只是因为我曾经读过一次。
现在我想知道,这两者有区别吗?如果有,是什么呢...
我已经做了一段时间的正则表达式,但是对于特定规则的微妙差别并不是专家级。 我一直使用(.*?)
进行匹配,但有限制条件,因为我理解它会在第一次机会时停止匹配,而(.*)?
会继续匹配且更具贪心性。
但我没有真正的理由认为这样,只是因为我曾经读过一次。
现在我想知道,这两者有区别吗?如果有,是什么呢...
(.*?)
是一个包含非贪婪匹配的组。
(.*)?
是一个可选组,其中包含贪婪匹配。
.*?
也可以匹配空。 - SLaks有人指出了贪婪匹配和非贪婪匹配之间的区别。下面是一个实际应用中可以看到不同结果的示例。由于正则表达式通常嵌入在主机语言中,我将使用Perl作为主机。在Perl中,将匹配项括在括号中会将这些匹配项的结果分配给特殊变量。因此,在这种情况下,匹配可能相同,但分配给这些变量的内容可能不同:
例如,假设您的匹配字符串是“hello”。两个模式都可以匹配它,但匹配的部分($1)不同:
'hello' =~ /(.*?)l/;
# $1 == 'he'
'hello' =~ /(.*)?l/;
# $1 == 'hel'
?)
定义了一个非贪婪量词,这意味着匹配结果将不同。当然,正如你所提到的,)?
是非匹配的,但这并不是完整的答案。 - Nir Levy*
表示“零个或多个”,这让事情有点混淆。两个 ?
是完全不同的,可以通过下面每个例子更清楚地展示:
fo*?
只会匹配 f
,如果你提供了 foo
。也就是说,这个 ?
使匹配变得非贪婪。将它移除后,它将匹配 foo
。
fo?
匹配 f
,但也匹配 fo
。也就是说,这个 ?
使匹配变得可选:它所应用于的部分(在本例中仅为 o
)必须出现 0 次或 1 次。将它移除后,匹配将变得必选:它必须恰好出现一次,因此只有 fo
仍然匹配。?
的不同含义时,还有一个意思:紧跟在 (
后面的 ?
是几个特殊操作的前缀,例如 lookaround。也就是说,它的意义不像你问的任何一件事。.*
只有作为子模式才有意义,否则它没有意义,因为它匹配所有内容。如果您想匹配至少一个字符,则+
将是正确的选择,它匹配一个或多个字符。也许您会对我写的博客文章感兴趣:你真的了解量词吗? - stema
?
多余了!因为(.*)
会匹配零到多个字符。 - Anirudha