前面章节介绍了正则表达式匹配可选字符(包含 ?、+ 和 * 模式),本章节将介绍正则表达式的大括号 {} 语法,使用大括号可以灵活的限制字符块出现的次数。
如果想要指定的匹配次数非常多,我们可以使用大括号语法来精确地指定要匹配的次数。例如:我们需要匹配 ABC 字符块 2~4 次。
假如要匹配带有 3 个数字的产品编号,我们可以使用一下模式:
ABC[0-9][0-9][0-9]
上面模式通过多次重复字符类来表示数字出现的次数。如果我们需要匹配 30 个数字的产品编号,岂不是要重复写 30 次 [0-9]。这将是非常麻烦的,可以使用大括号语法简化上面的写法,模式如下:
ABC[0-9]{3}
上面模式也能达到我们需要的效果,如果你要匹配 30 个数字的产品编号,模式如下:
ABC[0-9]{30}
在前面章节介绍过 ?、+ 和 * 模式字符的含义,它们的含义分别如下:
? 表示匹配零次和一次
+ 表示匹配一次和多次
* 表示匹配零次和多次
然而,{n,m} 大括号语法前面的 n 表示最小匹配次数,m 表示最大匹配次数。我们可以通过 {n,m} 模拟 ?、+ 和 * 模式字符,如下:
{0,1} 等价于 ?,例如:AAA[0-9]{0,1} 匹配有或没有数字的产品编码
{1,999999} 约等价于 +,例如:AAA[1,999999] 匹配有一个或多个数字的产品编码。但是,这里指定的最大匹配次数为 999999,而 + 模式符号能最大匹配无限次。如果我们考虑业务限制,其实两者也没有什么区别。产品编码后面的数字肯定是有限制的,不可能无限长。
{0,999999} 约等价于 *,例如:AAA[0,999999] 匹配有零个或多个数字的产品编码。但是,这里指定的最大匹配次数为 999999,而 * 模式符号能最大匹配无限次。
实例:匹配拥有3到9个数字的产品编码,模式如下:
ABC[0-9]{3,9}
上面模式可匹配拥有3个到9个数字的产品编码,如:
[√] ABC000
[√] ABC123456789
[×] ABC13
[√] ABC88877
{0,m} 语法可以指定最少匹配零次(由开始大括号后面的第一个数字指定)而最多匹配 m 次(由第二个数字指定,与指定最少次数的数字之间以逗号分隔,且位于结束的大括号前面)的情况。
因此,如果要指定最少匹配零次而最多匹配一次的情况,应该使用下面的模式:
{0,1}
上面模式和 ? 模式符号含义相同。
要指定最少匹配零次而最多匹配3次的情况,应该使用下面的模式:
{0,3}
然而,上面这个模式的含义是不能通过 ?、+ 和 * 模式符号来表达的。
实例:匹配至少拥有零个,最多拥有3个数字的产品编号,如下:
ABC[0-9]{0,3}
有时候,可能需要匹配无限次。这时,可以通过忽略大括号中的最大出现次数说明符来达到指定无限次的目的。
要指定至少两次而最多无限次,可以使用下面模式:
{2,}
可以使用该语法完全实现 ?、+ 和 * 模式字符的含义,如下:
{0,1} 等价 ?
{1,} 等价 +
{0,} 等价 *
例如:匹配最少拥有2个数字,最多拥有9个数字的产品编号,模式如下:
ABC[0-9]{2,9}
{n} 表示匹配 n 次
{n,m} 表示最小匹配 n 次,最大匹配 m 次
{0,m} 表示最小匹配 0 次,最大匹配 m 次
{n,} 表示最小匹配 n 次,最大匹配无限次