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

Col*_*fin 5 regex lookbehind

我无法使这个正则表达式工作,我找到的任何罐头工作都没有可靠的工作.

期望的结果:

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

"Person One"
"Person Two"
"Person Three"
Run Code Online (Sandbox Code Playgroud)

在这些示例行中:

By Person One, Person Two and Person Three
By Person One, Person Two
By Person One
By Person Two and Person Three
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的并注意到,如果你中断了部分,我会得到部分匹配,但是看起来有些东西会把它扔掉.此外,如果有一个更简单但更可靠的方法来拉动所有"人",无论是否提供一个,两个或三个"和".它没有支持比三个以上,但只要"和"道最后的"人"的肯定#可以保持变量不影响正则表达式,我觉得.

保存当前尝试(匹配一个,但如果你拆分我的后视并运行它然后它匹配所有"和"行:

(?<=by )((\w+) (\w+))(?:,\s*)?((\w+) (\w+))?(?:\s*(?<=and ))((\w+) (\w+))
Run Code Online (Sandbox Code Playgroud)

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

Ahm*_*eed 3

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

(?<=by )(\w+ \w+)(?:,\s*)?(\w+ \w+)?(?:\sand\s)?(\w+ \w+)?
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要将每个添加\w+到组中。

在线尝试一下


正则表达式中间的后向查找:

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

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

为了说明这一点,请看一下这个演示。正如您所看到的,模式在 后面出现时((?<=and )Person匹配。现在让我们将其更改为,您可能认为它会起作用,但实际上它找不到匹配项,那是因为它首先查找,然后查找,但没有找到它(因为“Person”没有找到)立即跟随“Two”),这样它就不会继续到下一步,即 Lookbehind。PersonandTwo (?<=and )PersonTwoPerson

在这种情况下,使 Lookbehind 发挥作用的唯一方法是在后面加上这样的and内容: ,这使得 Lookbehind 变得多余,如上所述。TwoTwo and (?<=and )Person

类似的行为,但是对于Lookaheads (即,当 Lookahead 出现在中间时)在这个很棒的答案be revo中得到了很好的解释。

希望有帮助。