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

问题描述:

我有一个奇怪的手机验证,我需要做的。下面的模式很适合我需要验证的规则,但由于某些原因星号被允许通过。为什么这个正则表达式允许星号通过?

^(?=.{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)343-2233
  • (501 343-2233
  • (501。 343-2233
  • 800 - .. 555-1234
  • - (8005551234

这些都是我需要失败值:。

  • * - (8005551234
  • 501 * 555-1234
  • - (80055512 41
  • 501_55 5_1234
  • 555-1234
  • 800 -........... 555-1234

的规则是:

  1. 字符串必须总长度为10-15个字符。
  2. 必须包含字符串中的正好10个数字。
  3. 可以在字符串中包含“(”,“)”,“”,“。”或“ - ”分隔符。
  4. 只要将数字分组到{3} {3} {4}中,多少个分隔符就会分组无关紧要。

所以两个问题:

  1. 我需要做什么改变为从通过消除星号?
  2. 我能做些什么来优化这个正则表达式?
+2

1.将方括号内的破折号分开:'-' - >'\ -'。 – idleherb 2015-04-02 20:56:17

+0

这就是@idleherb。非常感谢! – Bazinga 2015-04-02 20:58:37

我需要改变以消除通过星号?

您需要跳过character classes中的短划线。如果不逃脱,它确实表示一个范围 - 在你的情况下,\)-.相当于)*+,-.

如何优化此正则表达式?

我假设你的意思是“简化”。我可以看到序列[\(\)-. ]*?([0-9]{3})被重复三次,所以如果你不关心匹配的组,那么我宁愿使用

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

您可能还缩短[0-9]\d

+0

谢谢你的时间,答案和解释如何失败星号,但你发布的正则表达式似乎并不适用于我。 – Bazinga 2015-04-02 21:14:25

+1

@Bazinga:这[很好](https://regex101.com/r/kR1eB6/1)。什么不起作用,你用的是什么正则表达式味道/语言? – Bergi 2015-04-02 21:16:30

+0

现在看起来不错。我之前复制了它,并且得到了一个奇怪的位置“(”。 – Bazinga 2015-04-02 21:20:43

这里是优化的正则表达式:^(?=.{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