Regex 负向前看,匹配除“以外的每一行”;fname lname“名称”;正则表达式

Regex 负向前看,匹配除“以外的每一行”;fname lname“名称”;正则表达式,regex,Regex,我有多行文本,我想在每行上运行regex来查找匹配的文本 ^.*(?!fname lname)\b([A-Za-z'$]+ [A-Za-z'$]+) is present 它可以无缝工作,扫描没有输入名称的行,例如以下行: fname lname存在 fname和lname出现了 或fname lname存在 诸如此类的fname lname出现了 abcd efgh fname lname存在 链接: 但是,对于带有撇号的名称,它会断开 ^.*(?!fn'ame ln'ame)\b([A

我有多行文本,我想在每行上运行regex来查找匹配的文本

^.*(?!fname lname)\b([A-Za-z'$]+ [A-Za-z'$]+) is present
它可以无缝工作,扫描没有输入名称的行,例如以下行:

  • fname lname存在
  • fname和lname出现了
  • 或fname lname存在
  • 诸如此类的fname lname出现了
  • abcd efgh fname lname存在
链接:

但是,对于带有撇号的名称,它会断开

^.*(?!fn'ame ln'ame)\b([A-Za-z'$]+ [A-Za-z'$]+) is present
线路:

  • fn'ame ln'ame在场
  • fn'ame ln'ame在场
  • 或者fn'ame ln'ame在场
  • 胡说八道,我的名字,我的名字出现了
  • abcd efgh fn'ame ln'ame存在
链接:

如何使其适用于带撇号的名称

第一个示例之所以“似乎”适用,是因为在
fname lname

如果在之间添加一个单词,比如
fname lname test is present
,您可以看到它

在第二个例子中,很清楚为什么它不起作用。它之间没有额外的“单词”,但单词边界
\b
ln'ame

在这两个部分中,is应至少匹配
[A-Za-z'$]+[A-Za-z'$]+
,然后出现

在第一个示例中,它不能这样做,但在第二个示例中,它可以这样做,因为单词边界匹配并且将匹配
ame ln'ame
,后跟
is present

此行为的原因是由于在模式中使用
*
导致的回溯。它将首先匹配到行尾,然后断言右边的不是
fn'ame ln'ame
。这是真的,因为它位于字符串的末尾

然后,该模式放弃匹配,直到它可以适合该模式的其余部分

您可以通过在前瞻中添加
*
来修复模式。如果要匹配这两个变量,可以使用

^(?!.*fn'?ame ln'?ame)[A-Za-z'$]+(?: [A-Za-z'$]+)*$

我不确定自己是否理解。为什么不直接使用
fname lname is present
?你想在这里实现什么?这是一个不同的句子,我试图匹配没有fname lname的每一行。对于1000+文本。@ggorlen我在哪里可以输入名称@mandy8055是的,完全正确@Mandy8055,它在第一个链接中工作,但是,我现在对包含撇号的名称有问题。我更新了你的。请检查一下。如果您只想匹配所有不匹配fname和lname的字符串;您可以使用更高效、更清晰的正则表达式。非常感谢您的帮助,它正在工作,感谢您的解释。现在有道理了