我必须在.NET中验证NANP格式的10位(美国)电话号码(不允许特殊字符),并检查以确保电话号码的最后7位不重复。到目前为止,我已经编写了以下正则表达式来验证NANP格式
^(?:[2-9][0-8][0-9])([2-9][0-9]{2}[0-9]{4})$我如何修改这个正则表达式,使其也支持不重复的后7位数?请注意,由于现有代码的限制,不能使用两个正则表达式。
编辑:我必须检查所有7位数字中的连续重复。例如,2062222222应被视为无效,而2062221234或2062117777应被视为有效。
谢谢
发布于 2011-09-01 14:36:32
你是在说连续的重复数字,还是说所有的七个数字都必须是唯一的?例如:
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})$...while此命令不允许任何重复的数字:
^(?:[2-9][0-8][0-9])(?!.*(\d).*\1)([2-9][0-9]{2}[0-9]{4})$在使用完前三位数字之后,先行查找尝试查找重复的字符,要么立即((?!.*(.)\1)),要么带有可选的中间字符((?!.*(.).*\1))。这是一个消极的先行预测,所以如果它成功了,整体匹配就会失败。
EDIT:它证明问题比我想象的要简单。要过滤出像2345555555这样的数字,其中最后七位数字相同,请使用以下命令:
^(?:[2-9][0-8][0-9])(?!(\d)\1+$)([2-9][0-9]{2}[0-9]{4})$重要的是要包括结束锚($),因为如果没有它,它将无法匹配有效的数字,如2345555556。或者,您可以告诉它恰好再查找捕获的数字中的6个:(?!(\d)\1{6})。
发布于 2011-09-01 06:49:53
我很确定昨晚讨论的是非重复部分,普遍的共识是正则表达式不能直接处理非重复,你必须放入大量无法管理的替代情况。我不认为我真的看到了它的证明,但我很确定这是真的。归根结底,正则表达式没有内存。我建议您使用regexp来验证该格式,并通过单独的算法运行它以检查重复项。
https://stackoverflow.com/questions/7264184
复制相似问题