regular expression/regex(s) (2)Matching Numeric Ranges

[size=large][b]使用正则表达式匹配数字范围[/b][/size]

因为正则表达式主要是处理文本而不是数字,所以要匹配一个给定的范围的数字需要额外注意,你不能简单的写[0-255]来匹配一个数字范围0-255。尽管这是一个正确的表达式,但是它匹配的内容却完全和你想的不一样。[0-255]是一个字符类包含三个元素:字符范围0-2,字符5和字符5(再次)。这个字符类匹配的是单个字符:0,1,2或者5,像[0125]一样。
因为正则表达式作用于文本,一个正则表达式引擎(内部实现机制)对待0作为单个字符,255作为三个字符。为了匹配从0-255的所有的字符,我们需要一个正则表达式匹配一个字符到三个字符的范围。
[0-9]或者\d匹配单个数字0到9,[1-9][0-9]或者[\d&&[^0]][\d]匹配从10-99的两位数字。这些比较容易实现。匹配三个字符有些复杂,因为我们需要排除256-999的数字,使用|(或)结构,这样的话1[0-9]{2}或者1\d{2}表示100-199的数字,2[0-4][0-9]表示的200-249的数字,25[0-5]表示250-255的数字,所以综合起来的表示方式:1[0-9][0-9]或者1[0-9]{2}|2[0-4][0-9]|25[0-5]。
像你看到的一样,需要将数字范围按范围分割,每一个范围允许对每个数字相同的变化,在这个例子中有3个数字范围,数字以1开始的允许10个数字对于剩下的两位,然而,数字以2开始的数字剩余两位就受到了限制.
把上面的放在一起,使用间隔(alternation)我们可以得到[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5],这个匹配了我们想要得数字,但是要注意了:正则表达式搜索通常允许部分匹配,所以这个正则表达式可以匹配123 在12345, 对此有两种解决方案.
如果你在一分较大的文档中或者输入串中搜索这些数字,使用词边界来要求一个非字母字符在其以前或者其后有有效的匹配.表达式变成\b[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]\b.因为分割操作是所有操作中优先权最低的,而圆括号需要将其组合到一起.这样的话,正则表达式引擎将匹配第一个词边界内容,然后再匹配其分割操作中的内容,接着匹配第二个词边界的内容.正则表达式引擎考虑到所有的字母数字字符,还有下划线作为\w字符.
如果你是用证则表达式来验证输入,你将很可能想要检查整个输入是有效的数字组成. 使用锚(anchors)代替词边界^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$.
下面是一些常用的数字范围的匹配你可能用得到:

* 000..255: ^([01][0-9][0-9]|2[0-4][0-9]|25[0-5])$
* 0 or 000..255: ^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$
* 0 or 000..127: ^(0?[0-9]?[0-9]|1[0-1][0-9]|12[0-7])$
* 0..999: ^([0-9]|[1-9][0-9]|[1-9][0-9][0-9])$
* 000..999: ^[0-9]{3}$
* 0 or 000..999: ^[0-9]{1,3}$
* 1..999: ^([1-9]|[1-9][0-9]|[1-9][0-9][0-9])$
* 001..999: ^(00[1-9]|0[1-9][0-9]|[1-9][0-9][0-9])$
* 1 or 001..999: ^(0{0,2}[1-9]|0?[1-9][0-9]|[1-9][0-9][0-9])$
* 0 or 00..59: ^[0-5]?[0-9]$
* 0 or 000..366: ^(0?[0-9]?[0-9]|[1-2][0-9][0-9]|3[0-5][0-9]|36[0-6])$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值