在这篇文章中,你将学习如何在正则表达式中匹配数字及数字范围。正则表达式中的数字范围可以匹配 0-9、1-9、0-10、1-10、1-12、1-16,以及 1-31、1-32、0-99、0-100、1-100、1-127、0-255、0-999、1-999、1-1000、1-9999 等各种范围。
提示:如需测试正则表达式匹配效果,可使用本站提供的在线正则表达式测试工具。
关于正则表达式的很重要的一点是:它不认识数字,它也不知道如何计数,因此正则表达式不能理解 1-100 的意思是指从数字 1 到数字 100。原因在于,正则表达式只能处理文本而不是数字(即正则表达式是基于文本的匹配)。因此,在正则表达式中,对数字、数字范围(或数值范围)进行正则匹配、搜索、验证、替换等操作时,你必须特别小心。
举个例子,比如你想匹配 1 到 100 的数字,你写下了下面这个正则表达式:
/[1-100]/
你期望这个正则表达式能够匹配 1 到 100 之间的所有数字,它确实能用,但匹配的范围并不是期望的那样。这个正则表达式只会匹配 2 个数字(是的,只匹配 2 个数字,绝对只有 2 个),你能猜出是哪 2 个数字吗?如果你仔细审视这个正则表达式,就知道,该表达式将只会匹配 0 和 1 这 2 个数字,没有其他可匹配的了。类似的,范围表达式 [0-255]
将匹配 0、1、2、5 这 4 个数字。首先,0-2
这个范围,将匹配 0、1、2 这 3 个数字,而字符 5
在这个范围表达式中写了 2 遍,将匹配数字 5。
好了,现在让我们开始研究正则表达式中数字匹配的基本逻辑和理论。
正则表达式中的数字
最简单的数字匹配是字面上的匹配。如果你想匹配数字 3,那么就直接写成 /3/
,如果你想匹配数字 99,那么就用 /99/
,它们都能成功匹配。同样的,/2022/
这个表达式将匹配数字 2022,这些都是数字字面匹配。但是,数字字面匹配缺少灵活性,它与文本中的数字匹配或数字范围匹配存在很大不同。
使用 \d
匹配单个或多个数字
在正则表达式中,为了匹配 0 到 9 之间的数字,我们可以使用 \d
元字符,它将匹配 0 到 9 之间的任意单个数字。
\d
等价于 [0-9]
,或者说匹配 0 到 9 之间的任意数字,我们使用 [0-9] 这个表达式作为 0123456789 的简写方式,中括号 []
表示字符范围。
[1-9][0-9]
将匹配 10 到 99 之间的两位数字。
但是,如果你想匹配任意数字,比如 2、55、235、9875 等,你需要在上面的表达式后面添加一个量词。
表达式 /\d+/
中的 +
就是量词,它表示匹配 1 个或多个数字。
匹配 2 个或 3 个 数字
为了严格匹配 2 个数字,我们使用 /\d{2}/
这个表达式,其中,{}
表示量词,2 表示匹配两次;类似的,/\d{3}/
表示匹配 3 个数字,以此类推。
关于数字范围的正则匹配
现在,我们来谈一谈关于数字范围及其对应的正则表达式的含义。通常,在数字前面和后面使用单词边界符 \b
(或者 ^
)和 $
来表示字符串的开头或结尾。
匹配数字 0-9 的正则表达式
匹配数字 0 到 9 点正则表达式非常简单:
/[0-9]/
匹配数字 1-9 的正则表达式
匹配 1 到 9 之间到任意数字,正则表达式如下:
/[1-9]/
类似的,你可以使用正则表达式 /[3-7]/
来匹配 3 到 7 之间的任意数字,使用 /[2-5]/
来匹配数字 2、3、4、5。
匹配数字 0-10 的正则表达式
要匹配 0 到 10 之间的数字,要比之前稍微复杂一点,会使用一种不同的方式。匹配过程将被分解为 2 个步骤:
- 匹配数字 0 到 9
- 匹配数字 10
因此,最终的正则表达式如下:
/\b([0-9]|10)\b/
解释如下:
上述 2 个步骤,我们使用了 2 个代码片段:
- 匹配数字 0 到 9,我们使用
[0-9]
这个表达式 - 匹配数字 10,我们直接使用字面匹配 10。
同时,我们使用了分组表达式以及 |
操作符(表示“或”),整个正则表达式的意思是匹配数字 0 到 9 或者数字 10。
匹配数字 1-10 的正则表达式
和上面类似,匹配 1 到 10 之间到任意数字到正则表达式是:
/\b([1-9]|10)\b/
匹配数字 1-12 的正则表达式
/\b([1-9]|1[0-2])\b/
数字范围 1 到 12 可以分解为 2 部分:
- 匹配数字 1 到 9,用
[1-9]
表示 - 匹配数字 10 到 12,用
1[0-2]
表示
匹配数字 1-16 的正则表达式
写法如下:
/\b([1-9]|1[0-6])\b/
本例中,数字范围被分为以下 2 部分:
- 数字 1 到 9
- 数字 10 到 16
匹配数字 1-31 的正则表达式
写法如下:
/\b([1-9]|[12][0-9]|3[01])\b/
在这个例子中,数字范围 1-31 被分解为 3 部分:
- 数字 1 到 9,用
[0-9]
表示 - 数字 10 到 29,用
[12][0-9]
表示 - 数字 30 到 31,用
3[01]
表示
匹配数字 1-32 的正则表达式
用于匹配数字 1 到 32 的正则表达式如下:
/\b([1-9]|[12][0-9]|3[0-2])\b/
它也被分为了 3 部分:
- 数字 1 到 9,用
[0-9]
表示 - 数字 10 到 29,用
[12][0-9]
表示 - 数字 30 到 31,用
3[02]
表示
匹配数字 0-99 的正则表达式
匹配数字 0-99 的正则表达式的写法如下:
/\b([0-9]|[1-9][0-9])\b/
0 到 99 这个数字范围被分为了 2 部分:
- 0 到 9,用
[0-9]
表示 - 10 到 99,用
[1-9][0-9]
表示
匹配数字 0-100 的正则表达式
写法如下:
/\b([0-9]|[1-9][0-9]|100)\b/
该正则表达式被分为了 3 部分,其中第 3 部分是字面匹配 100。
匹配数字 1-100 的正则表达式
数字 1-100 范围的正则表达式如下:
/\b([1-9]|[1-9][0-9]|100)\b/
- 第 1 部分匹配数字 1 到 9
- 第 2 部分匹配数字 10 到 99
- 第 3 部分是字面匹配 100
匹配数字 1-127 的正则表达式
写法如下:
/\b([1-9]|[1-9][0-9]|1[01][0-9]|12[0-7])\b/
在匹配数字 1 到 127 时,将被划分为以下几部分:
- 1 到 9
- 10 到 99
- 100 到 119
- 120 到 127
匹配数字 0-255 的正则表达式
数字 0 到 255 同样将被分成 3 部分:
1、0-199
该部分的正则表达式写法为:
[01]?[0-9][0-9]?
2、第二部分是 200-249,其对应的正则表达式是:
2[0-4][0-9]
3、最后一部分是 250-255,正则表达式是:
25[0-5]
因此,匹配数字 0-255 最终的正则表达式写法是:
/\b([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/
匹配数字 0-999 的正则表达式
我们先给出 0-999 正则表达式的写法:
/([0-9]|[1-9][0-9]|[1-9][0-9][0-9])/
可以得知,上述匹配 0-999 的正则表达式,被划分为 3 部分,分别是:
- 0 到 9
- 10 到 99
- 100 到 999
匹配数字 1-999 的正则表达式
匹配数字 1-999 的正则表达式的写法是:
/([1-9]|[1-9][0-9]|[1-9][0-9][0-9])/
匹配数字 1-1000 的正则表达式
匹配数字 1-1000 的正则表达式的写法是:
/([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|1000)/
匹配数字 1-9999 的正则表达式
匹配数字 1-9999 的正则表达式的写法是:
/([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9])/
全文完,感谢阅读,希望本文对你理解正则表达式中的数字匹配有一定的帮助。