我必须在.NET中验证NANP格式的10位(美国)电话号码(不允许使用特殊字符),并检查以确保电话号码的最后7位数字不重复。到目前为止,我已经编写了以下正则表达式来验证NANP格式
^(?:[2-9][0-8][0-9])([2-9][0-9]{2}[0-9]{4})$
如何修改此正则表达式以解释非重复的最后7位数?请注意,由于现有代码的限制,使用两个正则表达式是不可取的。
编辑: 我必须检查所有7位数的连续重复。对于例如2062222222应视为无效,而2062221234或2062117777应视为有效。
由于
答案 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验证格式并通过一个单独的算法运行它来检查重复。