限制重复次数

-1 投票
1 回答
5035 浏览
提问于 2025-04-18 08:36

我需要确定如何用一个模式字符串(pat)来匹配一个源字符串(src),就像这样:

src ='AAAABBBB'
pat ='(A+|B+)B+'

不过,'+'这个符号可以匹配任意一个或多个出现的字符,这在源字符串很大的时候可能会非常慢。但是因为我确切知道源字符串是什么,我可以设计一个模式来精确匹配每个部分中'A'或'B'出现的次数,比如:

pat = '(A|B)\4B\4'

但是我的问题还需要一种语法,可以匹配最多4次出现的情况,比如:

pat= '(A|B)\4(or less)B\4(or less)'

有没有人知道这种语法?

1 个回答

14

你可以用 {m} 这种写法来指定重复的次数,其中 m 是你希望的重复次数:

A{4}B{4}

这就要求恰好有四个 A 和四个 B 字符。

还有类似的写法可以指定一个范围,而不是固定的数字;可以参考 正则表达式语法文档

{m}
这个写法表示前面的正则表达式需要恰好匹配 m 次;如果匹配的次数少于这个,整个正则表达式就不匹配。例如,a{6} 只会匹配六个 'a' 字符,但不会匹配五个。

{m,n}
这个写法让正则表达式可以匹配前面的表达式从 mn 次的重复,尽量匹配尽可能多的重复次数。例如,a{3,5} 会匹配3到5个 'a' 字符。如果省略 m,就表示最少为0次;如果省略 n,就表示没有上限。比如,a{4,}b 会匹配 aaaab 或者一千个 'a' 字符后面跟一个 b,但不会匹配 aaab。注意,逗号不能省略,否则会和之前的写法搞混。

{m,n}?
这个写法让正则表达式可以匹配前面的表达式从 mn 次的重复,但尽量少匹配。这是前面写法的非贪婪版本。例如,在字符串 'aaaaaa' 中,a{3,5} 会匹配5个 'a' 字符,而 a{3,5}? 只会匹配3个字符。

撰写回答