需要帮助阻止3位前缀

时间:2013-07-12 21:41:32

标签: regex

我有以下正则表达式:

^\+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)。但是,441443444等应匹配。所以+1242441应该是正则表达式的成功匹配。

如何将4[^0169]\d扩展为与442不匹配以及已被阻止的?{/ p>

2 个答案:

答案 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)

尽管在的工具提示中给出了建议,但您还没有提供您正在使用的语言/风格。如果它支持zero-width assertions,那么以下应该可以解决问题:

4[^0169]\d(?(?<=42)(?!))

我添加了conditional expression,会检查前两个字符是否为42。如果是,那么(?!)将强制表达失败。