【发布时间】:2021-09-19 17:44:48
【问题描述】:
正则表达式:
/(?<nn>(?!und)[^\/,&;]+)(?:,\s?+)(?<vn>(?1))(?:\/|&|;|und|$)\s?/
应该使用preg_match_all产生两个匹配
nn(1): Oidtmann-van Beek
vn(1): Jeanne
nn(2): Oidtmann
vn(2): Peter
关于示例字符串Oidtmann-van Beek, Jeanne und Oidtmann, Peter
这适用于 PCRE2 (PHP >= 7.3)。
但 PHP
【问题讨论】:
-
我认为像
/\b(?<nn>(?!und\b)\w+(?:[-'\s]+(?!und\b)\w+)*),\s?(?<vn>(?&nn))\b/u这样更精确的模式会更好。见this regex demo。 -
如果没有用于测试的示例字符串,很难判断。我在这个组中看到了一件有趣的事情:
(?:,\s?+)— 我不确定 php 会如何处理\s?+(一个或多个 可选 空格)。我会尝试\s*(零个或多个空格)。这可能对 PCRE 编译器更有意义。 -
@rickdenhaan
\s?+匹配 1 或 0 个空白,它在 PCRE 和 PCRE2 中都是有效模式。 -
原因是PCRE2中的子程序模式不是原子的,可以回溯到。