18-正则匹配数字范围

1. 正则匹配数字范围

正则表达式是为了匹配字符而设计的,而并不是为了匹配数字,所以当你使用正则匹配指定范围内的数字的时候你需要额外小心。表达式[0-255]并不能匹配0至255之间的数字。表达式[0-255]是一个字符集,它的含义是匹配 0,1,2,5中任意一个字符,这个表达式等同于[0125]

正则引擎真正处理的是字符,所以数字0对于引擎来说是一个字符,而255对于引擎来说是长度为3的字符。所以如何要匹配0至255中的所有数字,我们需要让引擎匹配长度为一到三之间的字符。

表达式[0-9]可以匹配09之间的数字。`[1-9][0-9]`可以匹配1099之间的数字。这两个是最简单的。

匹配三位整数略微复杂一点,因为我们要排除256至999之间的整数。1[0-9][0-9]可以匹配100至199。2[0-4][0-9]匹配200至249。最后25[0-5]匹配250至255。

你可以发现当我们匹配0到255之间的整数时,我们需要按照字符的长度来分割这个范围。在匹配三位整数的时候,如果百位是 1 ,那么十位和个位允许出现 0 至 9 之间的10个字符,如果百位是 2 ,那么十位和个位的字符将进一步做限制。

把前面三个部分用选择符连接起来,我们就得到了0只255之间所有的整数:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]。这个方法还存在一个缺陷:正则表达式通常允许部分匹配,所以这个表达式可以匹配到 12345 中的 123。有两个方法可以解决这个问题。

2. 搜索指定长度的字符

如果你在一个文档中所搜数字,你可以使用词语边界锁定数字的范围:\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b。因为选择符的优先级是最低的,所以我们要在选择外加上括号。这样引擎会先匹配第一个边界符\b,然后匹配整个选择符,最后匹配最后一个\b

3. 验证指定长度的字符

如果你想验证用户输入内容,那么或许你想验证的是用户输入的完整内容,而不是其中的部分。你可以使用位置字符^([0-9]|[1-9][0-9]|1[0-9][0-9]|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[01][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])$
### 正则表达式中特殊字符的含义 在正则表达式的上下文中,某些字符具有特殊的含义,这些字符被称为“元字符”。以下是关于 `%`、`+` 和 `-` 这些特殊字符的具体解释: #### `+` 的功能 元字符 `+` 表示其前一个元素必须至少出现一次,并且可以重复多次。这意味着如果某个模式后面跟有 `+`,那么该模式应该存在一到多个连续实例才能成功匹配[^4]。 例如,在字符串 "aaabbbccc" 中使用 `b+` 可以匹配三个连续的 b 字符:"bbb". ```python import re pattern = r'b+' text = 'aaabbbccc' matches = re.findall(pattern, text) print(matches) # 输出 ['bbb'] ``` #### `-` 的角色 当位于方括号内的两个字符之间时,减号 `-` 定义了一个字符范围。它指定了从左边字符到右边字符按ASCII顺序排列的一系列字符集合。比如 `[a-z]` 将匹配任何一个从小写 a 到小写 z 的字母;同样地,对于数字也可以定义类似的范围如 `[0-9]`. 然而,当不在方括号内或作为第一个/最后一个字符出现在方括号内部时,则被当作普通字符对待[^2]. ```python import re pattern = r'[A-Z]-[a-z]' text = 'A-b C-d E-f G-h I-j K-l M-n O-p Q-r S-t U-v W-x Y-z' matches = re.findall(pattern, text) print(matches) # 输出 ['A-b', 'C-d', 'E-f', ... , 'Y-z'] ``` #### 关于 `%` 值得注意的是,在标准 POSIX 基础和扩展正则表达式里并没有直接赋予 `%` 符号特别的意义。因此,默认情况下它可以被视为普通的百分比符号而不是元字符。不过需要注意的是,在一些特定的应用场景下(例如 URL 编码),这个符号可能拥有其他用途,但这超出了基本正则表达式的范畴[^1].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值