跳到主要内容

5.2 匹配的重复次数

上节学习的 +*? 解决了许多问题,但有些问题光靠它们还不够。请思考以下问题:

  • +* 匹配的字符个数没有上限。我们无法为它们将匹配的字符个数设定一个最大值。
  • +*? 至少匹配零个或一个字符。我们无法为它们将匹配的字符个数另行设定一个最小值。
  • ❑ 如果只使用 +* ,我们无法把它们将匹配的字符个数设定为一个精确的数字。

为了解决这些问题并让程序员对重复性匹配有更多的控制,正则表达式语言提供了一个用来设定重复次数(interval)的语法。重复次数要用 {} 字符来给出——把数值写在它们之间。

注意

{} 是元字符。如果需要匹配“{”和“}”本身,就应该用 \ 对它们进行转义。不过,即使你没有对 {} 进行转义,大部分正则表达式实现也能正确地处理它们(根据具体情况把它们解释为普通字符或元字符)。话虽如此,为了避免不必要的麻烦,你最好不要依赖这种行为;在需要把 {} 当做普通字符来匹配的场合,还是使用它们的转义序列 \{\} 比较稳妥。

5.2.1 为匹配次数设置一个精确值

如果你想为重复匹配次数设定一个精确的值,把那个数字写在 {} 之间即可。比如说, {3} 意味着模式里的前一个字符(或字符集合)必须在原始文本里连续重复出现 3 次才算是一个匹配;如果只重复了两次,则不算是一个匹配。

还记得我们之前多次使用过的匹配 16 进制颜色值的例子吗?

#\p{Hex}\p{Hex}\p{Hex}\p{Hex}\p{Hex}\p{Hex}
在工具中查看
body {
	background-color: #336633;
	color: #ffffff;
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}

这个模式从功能上来说并没有什么问题,但里面的 \p{Hex} 重复了 6 次。下面是使用精确值设置重复次数的例子。

#\p{Hex}{6}
在工具中查看
body {
	background-color: #336633;
	color: #ffffff;
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}

使用精确值后模式是不是精简了非常多。

5.2.2 为重复匹配次数设定一个区间

{} 语法还可以用来为重复匹配次数设定一个区间——也就是为重复次数设定一个最多值或(和)一个最小值。这种区间以 {最小值,最大值} 这样的形式给出。 {2,4} 的含义是最少重复 2 次,最多重复 4 次。看下面这个匹配 IPV4 地址的例子:

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
在工具中查看
路由器: 192.168.1.1
子网掩码:192.168.255.255
手机:192.168.1.10
电脑:192.168.1.120

IPV4 由 4 组数字组成,每组数字可能有 1 到 3 位数字。 \d 可以匹配出数字, {1,3} 匹配 1 到 3 位数字,再加上 \. 就可以匹配出 IPV4 地址了。

思考

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 可以匹配出 IPV4,但如果待匹配文本里面有“999.999.999.999”也会被匹配出来。显然“999.999.999.999”并不是有效的 IPV4 地址,你知道怎么做才能只匹配有效的 IPV4 吗?我们将在第七章学习到

5.2.3 匹配至少重复多少次

{} 语法的最后一种用法是给出一个最小重复次数,但不用给出最大。比如 {3,} 表示最少重复 3 次,但不限制最多重复的次数。看下面匹配 URL 地址的例子:

https?://[\w.]{3,}
在工具中查看
大家好,我是何方(HeFang)。欢迎来到正则表达式系列教程。更多内容请访问的何方的个人小站https://iamhefang.cn
注意

https?://[\w.]{3,} 来匹配 URL 并不严谨,请谨慎直接用于生产环境。

该内容基于 《正则表达式必知必会》 二度创作
转载请遵守原作者相关协议并注明本页地址
https://iamhefang.cn/tutorials/正则表达式/第五章-重复匹配/5.2-匹配的重复次数