![](/img/trans.png)
[英]Return number from a collection in a non-sequential, not random and non-repeating way
[英]Regex for NANP phone number with non-repeating last 7 digits
我必須在.NET中驗證NANP格式的10位數字(美國)電話號碼(不允許使用特殊字符),還要檢查以確保電話號碼的最后7位數字沒有重復。 到目前為止,我已經編寫了以下正則表達式來驗證NANP格式
^(?:[2-9][0-8][0-9])([2-9][0-9]{2}[0-9]{4})$
我如何修改此正則表達式以也計入非重復的最后7位數字? 請注意,由於現有代碼的限制,不能選擇使用兩個正則表達式。
編輯:我必須檢查所有7位連續重復。 例如,應將2062222222視為無效,而應將2062221234或2062117777視為有效。
謝謝
您是在談論連續的重復數字,還是所有七個數字都必須是唯一的? 例如:
2342497553 // consecutive duplicates
2345816245 // non-consecutive duplicates
2345816249 // no duplicates
此正則表達式過濾掉連續的重復項:
^(?:[2-9][0-8][0-9])(?!.*(\d)\1)([2-9][0-9]{2}[0-9]{4})$
...雖然這個不允許任何重復的數字:
^(?:[2-9][0-8][0-9])(?!.*(\d).*\1)([2-9][0-9]{2}[0-9]{4})$
使用完前三個數字后,超前查找會嘗試查找立即重復的字符( (?!.*(.)\\1)
)或帶有可選中間字符( (?!.*(.).*\\1)
)。 而且這是一個否定的前瞻性,因此,如果成功,則總體匹配失敗。
編輯:事實證明,這個問題比我想象的要簡單。 要過濾掉2345555555
類的2345555555
,其中最后七個數字相同,請使用以下命令:
^(?:[2-9][0-8][0-9])(?!(\d)\1+$)([2-9][0-9]{2}[0-9]{4})$
包括末尾錨( $
)很重要,因為如果不這樣做,它將無法匹配2345555556
類的有效數字。 或者,您可以告訴它查找捕獲的數字的正好另外六個: (?!(\\d)\\1{6})
。
我很確定昨晚出現了不可重復的部分,並且普遍的共識是正則表達式不能直接處理不可重復,您將不得不放入大量難以控制的替代案例。 我認為我實際上沒有看到過證明,但是我很確定這是真的。 歸結為正則表達式沒有內存的事實。 我建議您使用正則表達式來驗證格式,然后通過單獨的算法運行它以檢查重復性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.