正则表达式是设计为用来匹配文本的,可是论坛里头老是有这种问题:
“谁能帮我写个正则表达式,验证从0到180的数字。”
我说,正则表达式不是用来干这个的,匹配和验证是不一样的概念,数据验证过程可能包含很复杂的逻辑,而这个时候要用文本匹配来模拟,就变得很不科学。虽然,这个问题对于正则表达式并不是无解,可以写成这样:
^([0-9]{1,2}|1[0-7][0-9]|180)$
但用编程语言来判断显然方便直观的多,(x >= 0 && x <= 180)就可以了。你大概觉得上头那个正则表达式还不算复杂,那么看看这个:
“匹配从874到142857的数字。”
那正则表达式就得写成:
^(87[4-9]|8[8-9][0-9]|9[0-9]{2}|[1-9][0-9]{3,4}|1[0-3][0-9]{4}|14[0-1][0-9]{3}|142[0-7][0-9]{2}|1428[0-4][0-9]|14285[0-7])$
尽管还是可以做到,不过这个就有点走火入魔了。
不过呢,如果你非得这么做(比如客户逼你,我就是...),那我写了个小工具来干这个事情(写这种正则表达式,毕竟还是有规律可循)。下面是截图:
刚才那两个正则表达式,也是用这个工具生成的。代码在这里。
P.S.
这个工具目前尚不支持小数和负数,也许你可以基于我提供的代码写个更完整的版本出来。(不过,真的有必要吗?)
此外,这个工具尚未经过严格测试。发现问题了请给我发邮件或者在这里留言,多谢。
打印 | 张贴于 2006-06-09 12:16:00 | Tag:Patterns and Practice





留言反馈
如何防止用户输入纯数字,虽然这个星球上如此变态的人不是很多,但是总不能不防吧!比如 10000000000000000000共20位
怎么搞啊!
that's true, maybe you can help me to upgrade the code ;)
@leo
not really, regular expression do not support mathematic operators. as i've mentioned in the article, regex can be used to MATCH text only
因为"0000000000000001" 照你的意思也是数字吧,但是你的re无法校验吧
:D
不过关于匹配 01 这个问题,让我想起了以前用 javascript 的时候 parseInt("08") 出一个结果居然是 0——原来它把它当作 8 进制数了……
改为“个人认为不尽完美”好了:)
毕竟个人的观点有差异嘛,楼主息怒.
打分 -2,一无是处、毫无难度,败坏程序届风气,罪人啊罪人
NB 你整个逆向的出来,填个正则进去能用地球人语言说下这个正则干什么的
哎,太贱了这东西
tiaoci,数字前面多个0没关系的,因为实际应用时往往都要用int.Parse这样的方法来转换为数字,前面的0都会被忽略。
能匹配上01,显然不对吧
应该这样
^([\d]|[1-9]\d|1[0-7][0-9]|180)$
不知道是否有更简单的写法