温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - perl regex A(*ACCEPT)??B
perl regex

其他 - Perl正则表达式A(* ACCEPT)?? B

发布于 2020-04-11 23:19:45

我想匹配“ AB”,如果“ A”后面不是B,则仅匹配“ A”

我用了perl regex: A(*ACCEPT)??B

字符串“ AB”是很好的匹配,但是“ AC”却不返回“ A”。为什么?

我知道替代方法,但是我想用量词理解(* ACCEPT)。

我理解错了吗?谢谢你的帮助!

查看更多

提问者
Steven
被浏览
67
Wiktor Stribiżew 2020-02-04 19:26

您指向的文档说:

(*ACCEPT)是唯一可以量化的回溯动词,因为最小回零的不贪心的量化仅在发生回溯时才起作用。考虑例如

(A(*ACCEPT)??B)C

其中A,B和C可能是复杂的表达式。匹配“ A”后,匹配器处理“ BC”;如果失败,则导致回溯,(*ACCEPT)并且匹配成功。在这两种情况下,都捕获了除C外的所有内容。(*COMMIT)(见下文)表示“回溯失败”,而这种重复(*ACCEPT)表示“在回溯成功”。

但是,(*ACCEPT) 似乎与回溯无关,您可以在示例中看到它。 因此,AC 不能与之匹配A(*ACCEPT)??B因为:

  • A在模式中匹配A字符串
  • (*ACCEPT)?? 首先被跳过,因为它被量化了
  • B不能C在字符串中匹配,并且会失败。
  • 您希望发生回溯,但(*ACCEPT)??不会触发回溯

    一个更有用的(*ACCPET)用法示例

(*ACCEPT)我知道的唯一用例是,将交替的分支分配到并非所有分支都需要的更高版本的表达式中。例如,假设你想匹配任何模式的:BAZBIZBO

您可以简单地编写BAZ|BIZ|BO,但是如果B并且Z代表复杂的子模式,则可能会寻找将Band Z模式分解的方法。第一遍可能会给您带来帮助B(?:AZ|IZ|O),但该解决方案并不考虑因素Z另一个选择是B(?:A|I)Z|BO,但是它迫使您重复该操作B此模式允许您同时考虑B和和Z

B(?:A|I|O(*ACCEPT))Z

如果他的引擎遵循O分支,则它永远不会匹配,BOZ因为它会在遇到后BO立即返回(*ACCEPT)这就是我们想要的。