正则表达式模式匹配所有,并在找到特定单词时返回 null

问题描述

我有这个正则表达式。 ^BRN.*?(?:paid|to)\s([A-Za-z\s]+)\b(?<!\bself)

我希望它返回所需模式后的单词,但只是找不到某些单词。如果找到它们,则 Regex 不应返回任何内容。因此,

BRN CLG-CI IQ 支付 IONANDA PAUL

应该返回IONANDA PAUL,确实如此。所以那里是正确的。 但是我想要

BRN 到现金自我

返回空字符串或本质上匹配但不返回任何输出。目前,正则表达式返回这个 CASH\s,\s 表示输出中包含空格。我尝试了负面回顾,但我仍在寻找如何在找到该词时不返回任何内容。 谢谢!

解决方法

请注意,your regex 使用 CASH 捕获 BRN-TO CASH SELF 中的 ([A-Za-z\s]+)\b,因为一旦在 SELF 之后到达单词边界,负向后视会触发回溯,并且正则表达式引擎重新匹配字符串并开始产生一个一个又一个的字符,同时沿着字符串后退以最终在 SELF 之前找到单词边界位置,其中没有 SELF 作为整个单词出现在左边那个位置,这是一个有效的匹配。

您可以在 \s 之后使用负前瞻:

^BRN.*?(?:paid|to)\s(?![A-Za-z\s]*\bself\b)([A-Za-z\s]+)
#                   ^^^^^^^^^^^^^^^^^^^^^^^

参见regex demo

现在,在匹配 paidto 之后的空格后,将触发一次否定先行检查,如果在任何零个或多个 ASCII 之后有一个完整的单词 self字母或空白字符,则整个匹配将失败,否则将成功。