负后视不能作为 expected.How 来防止第二组捕获字符串?

Negative lookbehind not working as expected.How to prevent second group from capturing the string?

我想拒绝以BT开头的字符串(包括大小写)

原始正则表达式:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z] [A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))\s?[0-9][A-Za-z]{2})$

负面回顾正则表达式:

(?<!([bB][tT]))(^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z] [A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))\s?[0-9][A-Za-z]{2})$)

但是这个正则表达式仍然接受 BT444CC 第二组正在捕获 t 我该如何防止这种情况?

您不需要向后看,您需要在字符串的开头向前看,(?![Bb][Tt])

此外,您需要用非捕获组将整个模式括起来,否则,lookahead 只会限制第一个 | 之前的部分。

您可以使用

^(?![Bb][Tt])(?:[Gg][Ii][Rr] 0[Aa]{2}|([A-Za-z][0-9]{1,2}|([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2}|([A-Za-z][0-9][A-Za-z]|[A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))\s?[0-9][A-Za-z]{2})$

参见regex demo