限制重复次数
我需要确定如何用一个模式字符串(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}
这个写法让正则表达式可以匹配前面的表达式从 m 到 n 次的重复,尽量匹配尽可能多的重复次数。例如,a{3,5}
会匹配3到5个'a'
字符。如果省略 m,就表示最少为0次;如果省略 n,就表示没有上限。比如,a{4,}b
会匹配aaaab
或者一千个'a'
字符后面跟一个b
,但不会匹配aaab
。注意,逗号不能省略,否则会和之前的写法搞混。
{m,n}?
这个写法让正则表达式可以匹配前面的表达式从 m 到 n 次的重复,但尽量少匹配。这是前面写法的非贪婪版本。例如,在字符串'aaaaaa'
中,a{3,5}
会匹配5个'a'
字符,而a{3,5}?
只会匹配3个字符。