【问题标题】:Is there a meaningful usage of the lazy "??" in regex? [duplicate]懒惰的“??”有什么有意义的用法吗?在正则表达式? [复制]
【发布时间】:2019-01-09 13:46:10
【问题描述】:

根据量词的惰性,他们希望尽可能少地匹配。在我看来,量词?? 没有意义。因为如果previuos成功,总是有不匹配量化部分的选项。因此它是多余的。

例如apples??

将始终匹配 appleapples 仅在 apple 部分没有 s 结束

【问题讨论】:

    标签: regex computer-science pcre


    【解决方案1】:

    这是??? 产生不同结果的情况。

    要匹配的文本:a

    a? 将有 2 个匹配项 - "a"""

    a?? 将有 3 个匹配项 - """a"""。它还匹配开头的空字符串,因为它尝试尽可能少地匹配。

    ?? 存在的另一个原因是所有其他量词都有一个惰性对应物。 ?,也是一个量词,有一个懒惰的对应物是有意义的。

    【讨论】:

    • 好的,但它真的在某种方面有用吗?它产生不同的结果。单词apples 匹配不同。但是?? 是否赋予了表达式任何权力?我可以不写??吗?
    • @DIBits 欺骗目标没有回答你的问题吗?如果没有,请告诉我您仍然感到困惑的地方,我可以重新打开它。
    【解决方案2】:

    ?? 的另一个用途是让您的模式更有效率。 ?? 的惰性意味着它最初会尝试匹配前一个标记,并且会首先尝试匹配模式的其余部分。如果模式的其余部分昂贵,则使用懒惰的? 与贪婪的? 可能是一个有用的调整。举一个人为的例子,如果字符串是

    appleszzzzz
    

    并且模式是(贪婪的):

    apples?(?:.){6}$
    

    引擎将首先尝试匹配s,因为它是贪婪的。然后,它会重复 . 组 6 次,尝试匹配字符串的结尾,这将失败。然后它会回溯,放弃之前匹配的s,重复6个字符后跟$,就成功了。

    如果? 是惰性的,则不需要回溯,因为s 最初不会匹配。见

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

    举个例子 - 删除 ?? 的惰性部分,你会看到所需的步骤数从 21 跳到 33。模式的其余部分越昂贵,考虑这一点就越重要之类的。

    【讨论】:

      猜你喜欢
      • 2010-09-26
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 2012-01-26
      相关资源
      最近更新 更多