如果字符串以特定序列结尾,则正则表达式停止捕获任何内容



我很难让正则表达式做我需要的事情。

这是我想出的正则表达式:

(^([A-Z0-9]{3}[WTL])(TB)?(?!LG))

这就是我需要它做的:
从头开始捕获任何 3 个字符/数字序列,例如ABCA2CXYZ
继续捕获WTL
如果以下序列是TB
现在,如果当前捕获包括W之后的LGTLTB之后,破坏整个捕获,什么也没返回。

LG的最后一部分是我遇到的问题。

以下是我正在使用的一些示例字符串
The | 在我需要捕获之前会记下该点,但它不包含在原始字符串中。

应该捕获

ABCWTB|12345
ABCLTB|12345
FGHT|12345
AAAW|12345
B2BL|12345
XYZTTB|345345

不应该捕获任何东西(这些工作)

ABCLLG12345
FGHTLG12345
X2ZWLG12345

不应该捕获任何东西(这些不起作用)

ABCWTBLG12345
XYZTTBLG345345
F2HLTBLG345345

我当前的正则表达式适用于没有可选TB的字符串,但如果存在,它将匹配前 4 个字符。如果在可选的TB
之后存在LG我需要做什么来中断捕获我尝试了很多事情来让它工作。任何关于一点解释的帮助将不胜感激。

您需要将可选模式包含在负前瞻中,并将前瞻移到可选模式之前:

^([A-Z0-9]{3}[WTL])(?!(?:TB)?LG)(TB)?

请参阅正则表达式演示。

详情

  • ^- 字符串的开头
  • [A-Z0-9]{3}- 三个大写字母或数字
  • [WTL]-W/T/L
  • (?!(?:TB)?LG)(TB)?- 如果当前位置右侧有TBLGLG,则匹配失败的负预测
  • (TB)?- 可选的TB字符序列。

如果您的正则表达式风格支持所有格量词,则可以使用^([A-Z0-9]{3}[WTL])(TB)?+(?!LG),请参阅此正则表达式演示。或者,原子组:^([A-Z0-9]{3}[WTL])(?>(TB)?)(?!LG).

最新更新