范例 |
正则表达式范例 |
数字范围 |
浮点数 |
电子邮件地址 |
IP 地址 |
有效日期 |
数字日期转换为文本 |
信用卡号码 |
比对完整行 |
删除重复行 |
编程 |
两个相近的字词 |
陷阱 |
灾难性回溯 |
重复次数过多 |
阻断服务 |
将所有内容设为选用 |
重复捕获组 |
混合 Unicode 和 8 比特 |
更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教学 |
替换字符串教程 |
应用程序和语言 |
正则表达式范例 |
正则表达式参考 |
替换字符串参考 |
使用正则表达式比对数字范围
由于 正则表达式 处理的是文本而非数字,因此要比对特定范围内的数字需要特别小心。您无法只写 [0-255]
来比对 0 到 255 之间的数字。虽然这是一个有效的正则表达式,但它比对的是完全不同的东西。[0-255]
是 字符类别,包含三个元素:字符范围 0-2、字符 5 和字符 5(再次出现)。此字符类别比对单一数字 0、1、2 或 5,就像 [0125]
一样。
由于正则表达式处理的是文本,因此正则表达式引擎会将 0
视为单一字符,而将 255
视为三个字符。若要比对 0 到 255 之间的所有字符,我们需要一个比对一个到三个字符的正则表达式。
正则表达式 [0-9]
符合 0 到 9 的单一数字。 [1-9][0-9]
符合 10 到 99 的双位数字。这是简单的部分。
符合三位数字稍微复杂一点,因为我们需要排除 256 到 999 的数字。 1[0-9][0-9]
符合 100 到 199。 2[0-4][0-9]
符合 200 到 249。最后,25[0-5]
加入 250 到 255。
如你所见,你需要将数字范围分成具有相同位数的范围,而这些范围中的每个范围都允许每个位数有相同的变化。在我们范例中的 3 位数字范围中,以 1 开头的数字允许后两个数字有 10 个数字,而以 2 开头的数字则限制后面的数字。
使用 交替 将所有这些组合在一起,我们得到:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]
。这符合我们想要的数字,但有一个警告:正则表达式搜索通常允许部分符合,因此我们的正则表达式会在 12345
中符合 123
。这有两个解决方案。
搜索数字范围
如果您在较大的文档或输入字符串中搜索这些数字,请使用 字词边界,以要求非字词字符(或完全没有字符)出现在任何有效配对之前和之后。正则表达式就会变成 \b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b
。由于交替操作符具有最低优先级,因此需要 括号 将交替选项分组在一起。这样,正则表达式引擎会尝试配对第一个字词边界,然后尝试所有交替选项,最后尝试配对数字后面的第二个字词边界。正则表达式引擎会将所有字母数字字符以及底线视为字词字符。
验证数字范围
如果您使用正则表达式验证输入,您可能会想要检查整个输入是否包含有效的数字。为此,请将字词边界替换为 锚点,以配对字符串的开头和结尾:^([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 或 000..255:
^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$
- 0 或 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 或 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 或 001..999:
^(0{0,2}[1-9]|0?[1-9][0-9]|[1-9][0-9][0-9])$
- 0 或 00..59:
^[0-5]?[0-9]$
- 0 或 000..366:
^([012]?[0-9]?[0-9]|3[0-5][0-9]|36[0-6])$