我很难让正则表达式做我需要的事情。
这是我想出的正则表达式:
(^([A-Z0-9]{3}[WTL])(TB)?(?!LG))
这就是我需要它做的:
从头开始捕获任何 3 个字符/数字序列,例如ABC
或A2C
或XYZ
继续捕获W
、T
或L
如果以下序列是TB
现在,如果当前捕获包括W
之后的LG
,T
,L
或TB
之后,破坏整个捕获,什么也没返回。
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)?
- 如果当前位置右侧有TBLG
或LG
,则匹配失败的负预测(TB)?
- 可选的TB
字符序列。
如果您的正则表达式风格支持所有格量词,则可以使用^([A-Z0-9]{3}[WTL])(TB)?+(?!LG)
,请参阅此正则表达式演示。或者,原子组:^([A-Z0-9]{3}[WTL])(?>(TB)?)(?!LG)
.