在您的正则表达式中,(?=20){1,5} 表示“在 1 到 5 次之间执行正向预测 (?=20){1,5}”。这与执行一次具有相同的效果,显然不是您想要的。你想要的那部分表达式是
(?=20).{1,5}
其内容为“匹配 1 到 5 个字符,其中前两个必须是 '20'”。
但这仍然是个问题,因为它匹配字符串 '+20012 quick brown dogs' 中的 '+20012' 你需要一个字符串尾锚:
^\+(?=20).{1,4}$|...
请注意,我还将 {1,5} 更改为 {1,4},因为字符串最多可以包含 5 个字符,或者在“+”之后最多包含 4 个字符。还要注意与上面是一样的
^\+20.{1,2}$|...
这更简单,可以说读起来更好。因此,您可以将整个正则表达式修改为
^\+20.{1,2}$|^\+(?!20).{1,6}$/g
或者,为了减少重复,
^\+(?:20.{1,2}|(?!20).{1,6})$/g
首先,匹配“+200X”。它应该,除非是,“......当它以 +20 开头......”你的意思是,“......当它以 +20 开始时没有后跟数字......”。在我接下来的解决方案中,我假设您的意思是后者。
您可以尝试匹配以下正则表达式:
^\+(?:20(\D.?)?|(?!20(?!\d)).{0,6})$
Demo
表达式可以分解如下。
^ # match beginning of string
\+ # match '+'
(?: # begin non-capture group
20 # match '20'
(?:\D.?)? # optionally match a non-digit that is optionally
# followed by any character
| # or
(?! # begin negative lookahead
20 # match '20'
(?!\d) # negative lookahead asserts '20' is not followed by a digit
) # end negative lookahead
.{0,6} # match between 0 and 6 characters
) # end non-capture group
$ # match end of string
注意'+200' 与替换的第二部分匹配(字符串不以'20'开头)。