簡體   English   中英

不重復最后7位數字的NANP電話號碼的正則表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM