为什么这个正则表达式允许星号通过?
问题描述:
我有一个奇怪的手机验证,我需要做的。下面的模式很适合我需要验证的规则,但由于某些原因星号被允许通过。为什么这个正则表达式允许星号通过?
^(?=.{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
的规则是:
- 字符串必须总长度为10-15个字符。
- 必须包含字符串中的正好10个数字。
- 可以在字符串中包含“(”,“)”,“”,“。”或“ - ”分隔符。
- 只要将数字分组到{3} {3} {4}中,多少个分隔符就会分组无关紧要。
所以两个问题:
- 我需要做什么改变为从通过消除星号?
- 我能做些什么来优化这个正则表达式?
答
我需要改变以消除通过星号?
您需要跳过character classes中的短划线。如果不逃脱,它确实表示一个范围 - 在你的情况下,\)-.
相当于)*+,-.
。
如何优化此正则表达式?
我假设你的意思是“简化”。我可以看到序列[\(\)-. ]*?([0-9]{3})
被重复三次,所以如果你不关心匹配的组,那么我宁愿使用
^(?=.{10,15}$)([\(\)\-. ]*?[0-9]{3}){3}[0-9]
您可能还缩短[0-9]
到\d
。
答
这里是优化的正则表达式:^(?=.{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。
1.将方括号内的破折号分开:'-' - >'\ -'。 – idleherb 2015-04-02 20:56:17
这就是@idleherb。非常感谢! – Bazinga 2015-04-02 20:58:37