regex 负向后查找没有按预期工作,如何防止第二组捕获字符串?

ulmd4ohb  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(73)

我想拒绝以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我如何防止这种情况?

hjqgdpho

hjqgdpho1#

你不需要向后查找,你需要在字符串的开头(?![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

相关问题