2013-05-29

起因

正则表达式初次被我重视归咎于百合仙子,当时以为‘他’是美女,当然美女在群里出的题目都大家都相当重视去解决,估计当时有很多兄弟被他忽悠过。不过到现在来看,这种忽悠是值得的,终归最后是拓宽了知识面,同时认识了一群志趣相投的业内人士。

只所以今天重拾正则这个话题,原因是昨天有同事提到一次面试题,遇到此题。

题目

原文:如何匹配一个数字,范围在(1-65555)不可以使用分组|

分析

匹配数字,正则对应的元字符是\d,单词的开始结束\b,这样就有了雏形

`\b\d\d\d\d\d\b`

但是此时是配置5位任意数,对于1、2、3、4位数就无法匹配,解决的方法是加入限定符重复零次或一次,即

`\b\d?\d?\d?\d?\d?\b`

这样就可以匹配0-99999的数,要进一步对该值进行限制,就需要加入零宽度断言(?<!exp)最后的结果就是

`\b[1-6]?\d?(?<!6[6-9])\d?(?<!65[6-9])\d?(?<!655[6-9])\d?(?<!6555[6-9])\b`

结果

`\b[1-6]?\d?(?<!6[^1-5])\d?(?<!65[6-9])\d?(?<!655[6-9])\d?(?<!6555[6-9])\b`

这个结果还不是很完美,它包含了0开头的数字, 先做记录,以后再做完整。



blog comments powered by Disqus