使用正则表达式查找字符串中的名称,如果存在第二个名称,则不包括第一个名称


Find names in string using regex without including first names if second name is present

我有一个字符串和一个名称列表,我使用返回匹配项的preg_match_all来比较该字符串。然而,在名字列表中,有些名字只是名字或姓氏,而另一些则同时是名字和姓氏。请参阅下面的示例。

$names = 'jon|jon snow|lana|smith|lana smith|megan';
$string = 'Jon Snow and Lana Smith met up with Lana and Megan.';
preg_match_all("~'b($names)'b~i", $string, $matches);

上面的例子和我的当前表达式返回了所有的名称。这不是我想要的。

我想要的回报:琼·斯诺,拉纳·史密斯,拉纳·梅根

我不想返回的内容:jon,smith

您似乎在寻找负面的环视断言。

例如,jon(?! snow)"jon"匹配,但前提是" snow"未跟随。

$names = 'jon(?! snow)|jon snow|lana(?! smith)|(?<!lana )smith|lana smith|megan';

在regex101.com.上进行实时测试

另一种可能性——不太明确,但结果可比——是确保"复合"术语首先得到测试:

$names = 'jon snow|jon|lana smith|lana|smith|megan';

在regex101.com上进行实时测试。