为什么这个正则表达式允许星号通过?

时间:2015-04-02 20:51:29

标签: regex

我需要做一个奇怪的手机验证。以下模式适用于我需要验证的规则,但由于某些原因,允许星号通过。

^(?=.{10,15}$)[\(\)-. ]*?([0-9]{3})[\(\)-. ]*?([0-9]{3})[\(\)-. ]*?([0-9]{4})

我一直在使用此网站来测试我的表达:http://regexpal.com/

这些是我需要传递的值:

  • (501)555 1234
  • (501)-555.1234
  • 501-555-1234
  • 501.555.1234
  • 501 555 1234
  • 501)343-2233
  • (501 343-2233
  • (501.343-2233
  • 5013432233
  • 800 - .. 555-1234
  • - (8005551234

这些是我需要失败的值:

  • * - (8005551234
  • 501 * 555-1234
  • - (.80055512 41
  • 501_555_1234
  • 555-1234
  • 800 -........... 555-1234
  • 013432233

规则是:

  1. 字符串的长度必须为10-15个字符。
  2. 字符串中必须包含10个数字。
  3. 可以包含"(",")" ," ","。",或" - "字符串中的分隔符。
  4. 只要在{3} {3} {4}中对数字进行分组,分组的分隔符数就无关紧要。
  5. 所以有两个问题:

    1. 我需要做哪些更改才能消除星号传递?
    2. 如何优化此正则表达式?

2 个答案:

答案 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