正则表达式否定后视被忽略
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
然后匹配失败触发回溯,然后跳过匹配,搜索下一个匹配开始来自发生故障的索引。
这是我的正则表达式:
(?<!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
然后匹配失败触发回溯,然后跳过匹配,搜索下一个匹配开始来自发生故障的索引。