一切皆有可能

SLEEPY BUT POWERFUL (A.K.A 速马) Creative Commons License
随笔 - 43, 评论 - 483, 引用 - 14

导航

关于

我

联系方式 (夏桅 xia4 wei2)

译作

 

三章样章阅读
[CSDN读书频道提供]

 

想做点好事的来看看

一字不识的藏族同胞阿牛创办的完全免费学校

 

MVP Profile

Visual Developer - .NET/C#

Visitors

Locations of visitors to this page

标签

每月存档

最新留言

广告

 

正则表达式是设计为用来匹配文本的,可是论坛里头老是有这种问题:

“谁能帮我写个正则表达式,验证从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

留言反馈

#re: 写个正则表达式判断数字范围 编辑
代码怎么看不到,能不能提供次工具的下载
2008-03-04 14:34:36 | [匿名:effectchen]
#回复: 写个正则表达式判断数字范围 编辑
如果用户注册的时候允许使用数字加上字母,大小2~20位
如何防止用户输入纯数字,虽然这个星球上如此变态的人不是很多,但是总不能不防吧!比如 10000000000000000000共20位
怎么搞啊!

2008-01-26 15:40:00 | [匿名:southsiberia]
#回复: 写个正则表达式判断数字范围 编辑
判断时间范围怎么做?
2007-07-14 10:46:00 | [匿名:geginer]
#re: 写个正则表达式判断数字范围 编辑
呵呵,这东西效率如何?肯定不如直接比较吧.
2006-06-16 11:59:00 | [匿名:fcicq]
#re: 写个正则表达式判断数字范围 编辑
@tiaoci
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
2006-06-12 11:38:00 | [匿名:sunmast]
#re: 写个正则表达式判断数字范围 编辑
to sunmast,如果照你说的数字前面带0也是算数字的话,那你的还是不对

因为"0000000000000001" 照你的意思也是数字吧,但是你的re无法校验吧
2006-06-12 09:16:00 | [匿名:tiaoci]
#re: 写个正则表达式判断数字范围 编辑
不是吧,區配數字的表達式也有這麼復雜,正則表達式也有大於等於啊....
2006-06-10 15:18:00 | [匿名:leon]
#re: 写个正则表达式判断数字范围 编辑
Platinum,你果然很Platinum的说,而且现在似乎越来越严重乐
:D
2006-06-10 09:55:00 | [匿名:sunmast]
#re: 写个正则表达式判断数字范围 编辑
楼主真是勤奋啊,还研究了一下这个问题。
不过关于匹配 01 这个问题,让我想起了以前用 javascript 的时候 parseInt("08") 出一个结果居然是 0——原来它把它当作 8 进制数了……
2006-06-10 09:00:00 | [匿名:Robbie Mosaic]
#re: 写个正则表达式判断数字范围 编辑
看来“显然不对”有点冒犯楼主

改为“个人认为不尽完美”好了:)

毕竟个人的观点有差异嘛,楼主息怒.
2006-06-09 22:12:00 | [匿名:bestcomy]
#re: 写个正则表达式判断数字范围 编辑
刚想加 del.icio.us 之前突然想起点什么,略有所思,再一看标题,果然是你个贱人,实在贱的可以

打分 -2,一无是处、毫无难度,败坏程序届风气,罪人啊罪人

NB 你整个逆向的出来,填个正则进去能用地球人语言说下这个正则干什么的

哎,太贱了这东西
2006-06-09 18:44:00 | [匿名:Platinum]
#re: 写个正则表达式判断数字范围 编辑
Ninputer,多谢,是有这个bug,现在已经改过来了。
tiaoci,数字前面多个0没关系的,因为实际应用时往往都要用int.Parse这样的方法来转换为数字,前面的0都会被忽略。
2006-06-09 17:02:00 | [匿名:sunmast]
#re: 写个正则表达式判断数字范围 编辑
0 和1位数的分开就ok了
2006-06-09 16:52:00 | [匿名:tiaoci]
#re: 写个正则表达式判断数字范围 编辑
不过想法不错,可以对代码改进一下
2006-06-09 16:50:00 | [匿名:tiaoci]
#re: 写个正则表达式判断数字范围 编辑
"01" 不是数字吧?当然不应当匹配
2006-06-09 16:49:00 | [匿名:tiaoci]
#re: 写个正则表达式判断数字范围 编辑
^(87[4-9]|8[8-9][0-9]|9[0-9]{2}|[1-9][0-9]{3}|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])$ 貌似无法匹配“12345”和其他五位数
2006-06-09 15:49:00 | [匿名:Ninputer]
#re: 写个正则表达式判断数字范围 编辑
匹配01又怎么个显然不对法了
2006-06-09 13:45:00 | [匿名:sunmast]
#re: 写个正则表达式判断数字范围 编辑
^([0-9]{1,2}|1[0-7][0-9]|180)$
能匹配上01,显然不对吧

应该这样
^([\d]|[1-9]\d|1[0-7][0-9]|180)$

不知道是否有更简单的写法
2006-06-09 12:52:00 | [匿名:bestcomy]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0