【发布时间】:2019-05-24 08:04:21
【问题描述】:
我是 Perl 新手,正在使用正则表达式。当给定的查询字符串可能有多个匹配时,我无法决定 Perl 如何解决正则表达式匹配的歧义。例如
-
('hellohellohello' =~ m/h.*o/)这可以匹配 'hello'、'hellohello' 或 'hellohellohello'。它会选择哪一个——最短的还是最大的匹配?如果我们想要相反的行为(例如,如果默认是找到最短匹配然后找到最大匹配)怎么办?
-
如果第一个答案是最大的,请考虑
('hello hellohello' =~ m/h.*o/)在这里,它可以从第一行(换行符之前)或第二行(换行符之后)开始匹配 - 第一个与最大匹配。它会使用哪一个?
可用于确定字符串的哪个子字符串与给定正则表达式匹配的完整规则集是什么(可能是示例中提到的可以找到多个匹配项的情况除外)?
【问题讨论】:
-
查看贪婪和非贪婪量词。
-
带有
g标志的正则表达式通常不会像这样工作,一旦找到匹配项,正则表达式索引就会提升。因此,一般情况下,您不能在同一个位置进行多次匹配。然而,在 Perl6 中,这个问题得到了解决。 -
阅读regular-expressions.info/repeat.html,尤其是关于贪婪的部分。
-
@WiktorStribiżew 他并不是要得到所有的匹配,他只是想知道它会匹配哪一个。
-
@Barmar 然后 OP 需要类似
m/(?:h[^o]o){1,x}/的东西,其中x控制h...o重复的次数。否则,我应该把它作为另一个 My regex is matching too much. How do I make it stop? dupe 关闭。
标签: regex perl regex-greedy