我需要做一个奇怪的手机验证。以下模式适用于我需要验证的规则,但由于某些原因,允许星号通过。
^(?=.{10,15}$)[\(\)-. ]*?([0-9]{3})[\(\)-. ]*?([0-9]{3})[\(\)-. ]*?([0-9]{4})
我一直在使用此网站来测试我的表达:http://regexpal.com/
这些是我需要传递的值:
这些是我需要失败的值:
规则是:
所以有两个问题:
答案 0 :(得分:2)
我需要做些什么来消除星号的传递?
您需要在character classes中逃脱破折号。如果没有转义,则会表示范围 - 在您的情况下,\)-.
相当于)*+,-.
。
如何优化此正则表达式?
我认为你的意思是"简化"。我可以看到序列[\(\)-. ]*?([0-9]{3})
重复了三次,所以如果你不关心匹配的组,那么我宁愿使用
^(?=.{10,15}$)([\(\)\-. ]*?[0-9]{3}){3}[0-9]
您也可以将[0-9]
缩短为\d
。
答案 1 :(得分:1)
以下是优化的正则表达式:^(?=.{10,15}$)(?=.*(?:.*[0-9]){10}.*$)([()\s.-]*[0-9]{3}[()\s.-]*[0-9]{3}[()\s.-]*[0-9]{4})$
。
甚至更简化:^(?=.{10,15}$)(?:[()\s.-]*[0-9]{3}){3}[0-9]$
不要忘记锚点(^
行开始和$
行结束),并使用多行选项。在JavaScript中,它将是/m
:/^(?=.{10,15}$)(?:[()\s.-]*[0-9]{3}){3}[0-9]$/m
这是a demo。