负后视不能作为 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。
我想拒绝以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。