如何在正则表达式中正确匹配数字及数字范围?

正则表达式中的数字匹配

在这篇文章中,你将学习如何在正则表达式匹配数字及数字范围。正则表达式中的数字范围可以匹配 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 个步骤:

  1. 匹配数字 0 到 9
  2. 匹配数字 10

因此,最终的正则表达式如下:

/\b([0-9]|10)\b/

解释如下:

上述 2 个步骤,我们使用了 2 个代码片段:

  1. 匹配数字 0 到 9,我们使用 [0-9] 这个表达式
  2. 匹配数字 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. 匹配数字 1 到 9,用 [1-9] 表示
  2. 匹配数字 10 到 12,用 1[0-2] 表示

匹配数字 1-16 的正则表达式

写法如下:

/\b([1-9]|1[0-6])\b/

本例中,数字范围被分为以下 2 部分:

  1. 数字 1 到 9
  2. 数字 10 到 16

匹配数字 1-31 的正则表达式

写法如下:

/\b([1-9]|[12][0-9]|3[01])\b/

在这个例子中,数字范围 1-31 被分解为 3 部分:

  1. 数字 1 到 9,用 [0-9] 表示
  2. 数字 10 到 29,用 [12][0-9] 表示
  3. 数字 30 到 31,用 3[01] 表示

匹配数字 1-32 的正则表达式

用于匹配数字 1 到 32 的正则表达式如下:

/\b([1-9]|[12][0-9]|3[0-2])\b/

它也被分为了 3 部分:

  1. 数字 1 到 9,用 [0-9] 表示
  2. 数字 10 到 29,用 [12][0-9] 表示
  3. 数字 30 到 31,用 3[02] 表示

匹配数字 0-99 的正则表达式

匹配数字 0-99 的正则表达式的写法如下:

/\b([0-9]|[1-9][0-9])\b/

0 到 99 这个数字范围被分为了 2 部分:

  1. 0 到 9,用 [0-9] 表示
  2. 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 部分匹配数字 1 到 9
  2. 第 2 部分匹配数字 10 到 99
  3. 第 3 部分是字面匹配 100

匹配数字 1-127 的正则表达式

写法如下:

/\b([1-9]|[1-9][0-9]|1[01][0-9]|12[0-7])\b/

在匹配数字 1 到 127 时,将被划分为以下几部分:

  1. 1 到 9
  2. 10 到 99
  3. 100 到 119
  4. 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 部分,分别是:

  1. 0 到 9
  2. 10 到 99
  3. 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])/

全文完,感谢阅读,希望本文对你理解正则表达式中的数字匹配有一定的帮助。

分享