【发布时间】:2019-01-09 13:46:10
【问题描述】:
根据量词的惰性,他们希望尽可能少地匹配。在我看来,量词?? 没有意义。因为如果previuos成功,总是有不匹配量化部分的选项。因此它是多余的。
例如apples??
将始终匹配 apple 和 apples 仅在 apple 部分没有 s 结束
【问题讨论】:
标签: regex computer-science pcre
根据量词的惰性,他们希望尽可能少地匹配。在我看来,量词?? 没有意义。因为如果previuos成功,总是有不匹配量化部分的选项。因此它是多余的。
例如apples??
将始终匹配 apple 和 apples 仅在 apple 部分没有 s 结束
【问题讨论】:
标签: regex computer-science pcre
这是? 和?? 产生不同结果的情况。
要匹配的文本:a
a? 将有 2 个匹配项 - "a" 和 ""。
a?? 将有 3 个匹配项 - ""、"a" 和 ""。它还匹配开头的空字符串,因为它尝试尽可能少地匹配。
?? 存在的另一个原因是所有其他量词都有一个惰性对应物。 ?,也是一个量词,有一个懒惰的对应物是有意义的。
【讨论】:
apples 匹配不同。但是?? 是否赋予了表达式任何权力?我可以不写??吗?
?? 的另一个用途是让您的模式更有效率。 ?? 的惰性意味着它最初会尝试不匹配前一个标记,并且会首先尝试匹配模式的其余部分。如果模式的其余部分昂贵,则使用懒惰的? 与贪婪的? 可能是一个有用的调整。举一个人为的例子,如果字符串是
appleszzzzz
并且模式是(贪婪的):
apples?(?:.){6}$
引擎将首先尝试匹配s,因为它是贪婪的。然后,它会重复 . 组 6 次,尝试匹配字符串的结尾,这将失败。然后它会回溯,放弃之前匹配的s,重复6个字符后跟$,就成功了。
如果? 是惰性的,则不需要回溯,因为s 最初不会匹配。见
https://regex101.com/r/I6u6F2/2
举个例子 - 删除 ?? 的惰性部分,你会看到所需的步骤数从 21 跳到 33。模式的其余部分越昂贵,考虑这一点就越重要之类的。
【讨论】: