2

我有以下正则表达式:

^\+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

4

2 回答 2

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))
于 2013-07-12T21:48:09.287 回答
1

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

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

我附加了一个条件表达式,它将检查前两个字符是否为42. 如果是,(?!)则将强制表达式失败。

于 2013-07-13T02:21:40.990 回答