【问题标题】:Multiple possible matches for regex in Perl [duplicate]Perl中正则表达式的多个可能匹配项[重复]
【发布时间】: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


【解决方案1】:

* 是贪心的,所以它会尝试匹配最长的字符串,只要模式的其余部分仍然可以匹配。所以它将匹配hellohellohello

如果您改用*?,这将使其不贪婪,并且只要其余模式匹配,它将再次匹配最短的字符串。所以m/h.*?o/ 将匹配hello

【讨论】:

  • 只是贪婪/非贪婪并不能完全解决问题。请参阅可以匹配 'hello'、'hellohello' 或 'hellohellohello' 您的建议,仅匹配 'hellohellohello' 中的 hello(非贪婪)或 hellohellohello(贪婪)
  • 你没有理解这个问题。他想知道它实际上匹配了哪些可能的匹配项。贪婪被用来确定这一点。
  • 准确地说,在所有情况下,它都会从左到右匹配第一个可能的匹配项。贪婪只决定它是从那个位置开始的最短还是最长的匹配,即使它不是整体上可能的最短或最长的匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多