NANP电话号码的正则表达式,非重复的最后7位数字

时间:2011-08-31 22:22:47

标签: .net regex validation phone-number

我必须在.NET中验证NANP格式的10位(美国)电话号码(不允许使用特殊字符),并检查以确保电话号码的最后7位数字不重复。到目前为止,我已经编写了以下正则表达式来验证NANP格式

^(?:[2-9][0-8][0-9])([2-9][0-9]{2}[0-9]{4})$

如何修改此正则表达式以解释非重复的最后7位数?请注意,由于现有代码的限制,使用两个正则表达式是不可取的。

编辑: 我必须检查所有7位数的连续重复。对于例如2062222222应视为无效,而2062221234或2062117777应视为有效。

由于

2 个答案:

答案 0 :(得分:1)

您是在谈论连续重复数字,还是所有七位数都必须是唯一的?例如:

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之类的数字,后七位数相同,请使用:

^(?:[2-9][0-8][0-9])(?!(\d)\1+$)([2-9][0-9]{2}[0-9]{4})$

包含结束锚($)很重要,因为如果没有它,它将无法匹配有效数字,如2345555556。或者,您可以告诉它要查找捕获的数字中的六个以上:(?!(\d)\1{6})

答案 1 :(得分:0)

我很确定这个非重复部分是昨晚出现的,普遍的共识是正则表达式不能直接处理非重复,你必须放入一个无法管理的大量替代案例。我不认为我实际上已经证明了这一点,但我很确定这是真的。归结为正则表达式没有内存这一事实。我建议你使用regexp验证格式并通过一个单独的算法运行它来检查重复。