基于字符集{a,b}匹配a个数多于b的字符串的正则表达式求解
你之前写的正则实际作用是匹配a、b出现次数完全相等的字符串,自然无法满足a出现次数更多的需求,以下是可用解决方案:
方案1:支持平衡组的引擎(.NET、PHP 7.3+等)
逻辑最直观的计数实现,不受字符顺序限制:
^(?> (?<A>a) | (?<B>b) )* (?(A)(?(B)(?<-A>(?<-B>.)*)* (?(A)(?!))(?(B)(?=))|)|(?!))$
- 分别用
A、B两个栈统计a、b的出现次数 - 匹配完全部字符后比较两个栈的长度,
A栈长度大于B栈则匹配成功
方案2:支持正则递归的引擎(PCRE、Ruby、Python 3.11+等)
无需平衡组支持的轻量化实现:
^(?:a|b(?R))*a(?:a|(?R)b)*$
注意事项
标准正则文法本身不具备计数能力,如果你的运行环境不支持上述两种扩展特性,不建议强行用正则实现,直接遍历字符串统计a、b的出现次数进行判断,代码实现更简单且执行效率更高。
内容的提问来源于stack exchange,提问作者Sebastian Soler
相关产品推荐
相关产品推荐

