gpt4 book ai didi

regex - 解析多个名称 - 正则表达式中间的 Lookbehind 不起作用

转载 作者:行者123 更新时间:2023-12-04 19:27:58 29 4
gpt4 key购买 nike

我在让这个正则表达式工作时遇到了麻烦,而且我发现没有一个 jar 头可以可靠地工作。

想要的结果:

通过正则表达式匹配生成以下内容:

"Person One"
"Person Two"
"Person Three"

在这些示例行中:
By Person One, Person Two and Person Three
By Person One, Person Two
By Person One
By Person Two and Person Three

这是我所拥有的,并注意,如果你中断这些部分,我会得到部分匹配,但后视的东西将它扔掉。此外,如果有更好的方法更简单但仍然可靠,无论是提供一个、两个还是三个带有“和”的“人”,都可以拉出所有“人”。它不必支持超过三个,但我认为只要“和”小径持续“人”的#,当然可以保持可变而不影响正则表达式。

保存当前尝试(匹配一个,但如果你拆分 my 和 lookbehind 并运行它,那么它确实匹配所有“and”行:
(?<=by )((\w+) (\w+))(?:,\s*)?((\w+) (\w+))?(?:\s*(?<=and ))((\w+) (\w+))

https://regex101.com/r/z3Y9TQ/1

最佳答案

而不是使用 Lookbehind 来检查 and您可以像使用逗号所做的那样使用非捕获组:

(?<=by )(\w+ \w+)(?:,\s*)?(\w+ \w+)?(?:\sand\s)?(\w+ \w+)?

请注意,您不需要添加每个 \w+在一组。

Try it online .

在正则表达式中间回看:

在这种情况下,Lookbehind 不起作用的原因是它位于正则表达式模式的中间。这不是 Lookbehind 的工作方式。匹配从头开始,直到到达 Lookbehind(例如, (?<=prior)subsequent ),它匹配后面的内容(即 subsequent ),然后是 然后才它“向后看”期望找到 prior .所以基本上在 Lookbehind 之前的内容必须跟在 (?<=) 之后的内容之后。 (即 subsequent ),但 同时 ,在 Lookbehind 之后的内容之前必须是其中的内容(即 prior )。看看问题出在哪里?

因此,在您的示例中,将整个句子与中间的 Lookbehind 匹配的唯一方法是还包括 and在使 Lookbehind 变得多余的模式中。

为了说明,请看 this demo .如您所见,模式 ((?<=and )Person匹配 Person当它出现在 and 之后.现在让我们把它改成 Two (?<=and )Person ,您可能认为它会起作用,但实际上它是 finds no matches那是因为它首先寻找 Two ,然后查找 Person ,但它没有找到它(因为“Person”不会立即跟在“Two”之后),所以它不会继续下一步,即 Lookbehind。

在这种情况下,使 Lookbehind 工作的唯一方法是还包括 and紧跟在 Two 之后像这样: Two and (?<=and )Person ,这使得 Lookbehind 变得多余,如上所述。

类似的行为,但对于 前瞻 (即,当 Lookahead 在中间时)在 this awesome answer 中有很好的解释是 revo .

希望有帮助。

关于regex - 解析多个名称 - 正则表达式中间的 Lookbehind 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50283160/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com