正则表达式否定后视被忽略

Regex Negative Lookbehind ignored

这是我的正则表达式:

(?<!PAYROLL)(FIDELITY(?!.*TITLE)(?!.*NATION)|INVEST)(?!.*PAYROLL)

这是我的文字

INCOMING WIRE TRUST GS INVESTMENT 
VANGUARD PAYROLL
PAYROLL FIDELITY
ACH CREDIT FIDELITY INVESTM-FIDELITY
ACH CREDIT FIDELITY INVESTM-FIDELITY
ACH DEBIT FIDELITY 
ACH DEBIT FIDELITY 
ACH CREDIT FIDELITY INVESTM-FIDELITY

当 运行 在 http://regexr.com 上(使用 PCRE RegEx 引擎)时,它在 "PAYROLL FIDELITY" 上匹配,但我指定了一个负向后视不这样做(?<!PAYROLL).

感谢任何帮助。

(?<!PAYROLL) 否定回溯匹配一个没有紧跟在 PAYROLL 字符序列前面的位置。在 PAYROLL FIDELITY 字符串中, FIDELITY 不是紧跟在 PAYROLL 之前,而是紧跟在 PAYROLL + space.

您可以通过多种方式解决当前问题。如果您确定字符串中的单词之间总是有一个白色 space(比如,它是一个标记化的字符串),请在 PAYROLL 之后添加 \s(?<!PAYROLL\s).

如果可以有一个或多个白色space,(?<!PAYROLL\s+) 模式在 PCRE 中将无法像 PCRE 后视模式 must be of fixed width 一样工作。您可以匹配(某些)异常并使用 (*SKIP)(*FAIL) PCRE 动词跳过它们:

PAYROLL\s+FIDELITY(*SKIP)(*F)|(FIDELITY(?!.*TITLE)(?!.*NATION)|INVEST)(?!.*PAYROLL)

参见regex demo。您甚至可以将 PAYROLL\s+FIDELITY(*SKIP)(*F) 替换为 PAYROLL.*?FIDELITY(*SKIP)(*F)PAYROLL[\s\S]+?FIDELITY(*SKIP)(*F) 以跳过从 PAYROLL 到最左边 FIDELITY 的任何文本块。 PAYROLL\s+FIDELITY(*SKIP)(*F)匹配PAYROLL,一个或多个whitespace,FIDELITY然后匹配失败触发回溯,然后跳过匹配,搜索下一个匹配开始来自发生故障的索引。