2013-07-12 96 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。如果是,那麼(?!)將強制表達失敗。