2013-07-12 64 views
2

我有以下的正则表达式:需要帮助阻止3个前缀

^\+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以及已经阻止的那些?

+0

@anubhava:请解决它,拯救我们! –

+0

flinchböt先生更一般的目标是什么? –

回答

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)) 
+0

谢谢。我可以使用选项1,因为字符在得到这些之前已经被过滤掉了。但是,选项2没有问题,可能更容易用于进一步的编辑。非常感谢。 –

1

尽管在的提示给出的建议,你没有提供的语言/味道,你正在使用。如果它支持zero-width assertions,那么下面应该做的伎俩:

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

我已经附上了conditional expression这将检查是否在前两个人物都是42。如果是,那么(?!)将强制表达失败。