【问题标题】:How should a Lazy Optional quantifier behave?惰性可选量词应该如何表现?
【发布时间】:2019-08-29 17:06:16
【问题描述】:

我正在阅读有关量词的内容,并认识到??(惰性可选)量词的存在。从那以后我一直在运行一些测试,但是这个量词的行为看起来很不一致。

谁能给我举个这个运算符的例子吗?

另外,我尝试测试字符串abbb 的正则表达式/a??b+/,这给了我abbb 的意外匹配。我期望 bbb 匹配,因为惰性量词会优先考虑可能的较小匹配。

对于正则表达式/a+b??/ 和字符串aaab,匹配是预期的aaa 与由贪婪正则表达式/a+b?/ 匹配的aaab

我提前表示感谢,希望你们能帮助我了解这里发生的事情。 :)

【问题讨论】:

    标签: regex regex-greedy


    【解决方案1】:

    懒惰只在右边起作用,而不是左边。搜索模式匹配从左到右进行。一旦找到a 的匹配项,只要其余模式匹配,它就会尝试使用它。 a? 是贪婪还是懒惰并不重要。

    如果您比较模式 a+b?a+b?? 并输入类似的内容,那么懒惰很重要

    aaab
    

    贪婪版本将匹配整个字符串,懒惰版本将仅匹配aaa

    【讨论】:

      【解决方案2】:

      这可以通过aa 更好地说明:

      (a?)(a+)
      

      https://regex101.com/r/c6tNrM/2

      确保第 1 组具有a。将其余的 a 字符分配给第 2 组

      (a??)(a+)
      

      https://regex101.com/r/c6tNrM/3

      第 1 组可能包含 a,除非在第 2 组中有其他东西更贪婪地匹配它


      /a+b??/ 翻译成:

      • a+ - 给我所有连续的a 字符
      • b?? - 给我一个 b char 如果它存在 char 但我更喜欢你不要,除非有更多的正则表达式需要处理。另外,如果 b 在附加的正则表达式中匹配,那么我不想要它。

      /a+b?/ 转换为:

      • a+ - 给我所有连续的a 字符
      • b? - 如果存在,请给我一个 b char

      【讨论】:

      • 您是说惰性可选量词放弃其匹配以支持其他更贪婪的匹配。好的,对于您给出的示例,这看起来是正确的。但这不太适合我的问题,即第二个表达式不尝试匹配“a”。如果我遗漏了您的某些答案,请您尝试说明一下吗?
      • 我明白了!将这与@Barmar 在他的回答中所说的相加,如果在被量化的字符串的右侧有一些东西,那么量词将表现得很贪婪,除非接下来的内容与“贪婪”运算符匹配相同的东西。你同意这种说法吗?
      • @JaimeMendes 我想是的,是的。我不知道这是否是一个值得解释的论文,但它似乎描述了观察到的行为。
      • @JaimeMendes Google RE2 在github.com/google/re2/wiki/Syntax 提供了一个不错的小“重复”部分,我认为它可以方便地解释懒惰和贪婪的量词。
      猜你喜欢
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      • 2021-10-29
      • 2011-03-01
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多