能否编写正则表达式匹配A、B出现次数相等的字符串?
匹配A、B数量相等的字符串:正则可行吗?
先说结论:标准正则表达式做不到,但支持递归/平衡组的扩展正则引擎(比如PCRE、.NET、Python的regex库)可以实现。
为什么标准正则不行?
标准正则基于有限状态自动机,它没法跟踪A和B的计数平衡——这类要求“对等数量元素”的问题属于上下文无关语言,超出了正则语言的处理边界,就像正则没法完美匹配嵌套括号一样。
扩展正则的实现方式
以PCRE为例,我们可以用递归匹配来确保每一个A都对应一个B,不管顺序:
^((A(?1)?B)|(B(?1)?A))*$
简单解释下这个表达式:
^和$锁死整个字符串,避免部分匹配(A(?1)?B):先匹配一个A,然后递归匹配整个表达式(处理中间的平衡片段),最后匹配一个B(B(?1)?A):反过来,先B再递归再A*:允许上述平衡单元重复任意次(空字符串也会被匹配,因为0个A和0个B数量相等)
测试你的示例
用这个表达式跑你给的例子:
AB→ 匹配 ✅AABB→ 匹配 ✅ABAB→ 匹配 ✅AAB→ 不匹配 ❌(2个A,1个B,无法平衡)A→ 不匹配 ❌(只有A,没有对应的B)
更实用的替代方案
如果你的正则环境不支持递归(比如很多基础的JavaScript正则引擎),直接用代码统计A和B的数量再判断相等,会更高效、兼容性更好,逻辑也简单:遍历字符串,计数A和B的个数,最后比较两个数字是否相等就行。
内容的提问来源于stack exchange,提问作者Ano Nymous
相关产品推荐
相关产品推荐

