我有以下正则表达式:
^\+1242((35[79]|37[56]|46[^019]|44[^2]|4[^0169]\d|5[^0189]\d|6[34]\d|395|72\d))
我被困在"4[^0169]\d"
部分。
正确地说,如果您输入+1242413
,则不匹配。像+1242401
这样的东西也是如此。它在+1242441
上正确匹配(即,允许)。
我陷入困境,我也希望像"442"
一样阻止+1242442
。这应该不多(就像上面例子中的+1424401)。但是,441
或443
或444
等应匹配。所以+1242441
应该是正则表达式的成功匹配。
如何将4[^0169]\d
扩展为与442
不匹配以及已被阻止的?{/ p>
答案 0 :(得分:3)
我认为最简单的方法就是允许您想要允许的值(就像您已经完成的那样):
^\+1242((35[79]|37[56]|46[^019]|44[^2]|4[^01469]\d|5[^0189]\d|6[34]\d|395|72\d))
所以我不允许44*
(通过4[^01469]\d
)但允许除442
(通过44[^2]
)之外的所有内容作为替代方案。
但请注意,在此模式下,也允许使用124244a
。要解决这个问题,你必须重新考虑你的模式,以便它只包含正面的字符类:
^\+1242((35[79]|37[56]|46[2-8]|44[013-9]|4[23578]\d|5[2-7]\d|6[34]\d|395|72\d))
答案 1 :(得分:1)
尽管在regex的工具提示中给出了建议,但您还没有提供您正在使用的语言/风格。如果它支持zero-width assertions,那么以下应该可以解决问题:
4[^0169]\d(?(?<=42)(?!))
我添加了conditional expression,会检查前两个字符是否为42
。如果是,那么(?!)
将强制表达失败。