[英]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之前。
您可以通过各种方式解决当前问题。 如果您确定字符串中的单词之间总是有一个空格(例如,它是一个标记化的字符串),请在PAYROLL
之后添加\s
: (?<!PAYROLL\s)
。
如果可以有一个或多个空格,则(?<!PAYROLL\s+)
模式在 PCRE 中不起作用,因为 PCRE 后视模式必须是固定宽度。 您可能会匹配(某些)异常并使用(*SKIP)(*FAIL)
PCRE 动词跳过它们:
PAYROLL\s+FIDELITY(*SKIP)(*F)|(FIDELITY(?!.*TITLE)(?!.*NATION)|INVEST)(?!.*PAYROLL)
请参阅正则表达式演示。 您甚至可以将PAYROLL\s+FIDELITY(*SKIP)(*F)
替换为PAYROLL.*?FIDELITY(*SKIP)(*F)
或PAYROLL[\s\S]+?FIDELITY(*SKIP)(*F)
跳过PAYROLL
中的任何文本块,直到最左边的FIDELITY
。 PAYROLL\s+FIDELITY(*SKIP)(*F)
匹配PAYROLL
,一个或多个空格, FIDELITY
然后匹配失败触发回溯,然后跳过匹配并从失败的索引开始搜索下一个匹配发生了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.