正则匹配偶数个a、b字符串计数不匹配及支持任意c字符的方案咨询
正则问题解答
原有正则的错误原因
你编写的(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)未添加首尾锚定符^和$,正则引擎默认会匹配字符串中任意符合规则的子串。对于仅含单个a的字符串,(aa|bb)*可匹配0次(空内容),后续的可选分组也可匹配0次,因此会命中空匹配导致校验通过。如果仅针对无c的场景,给原有正则加上首尾锚定即可修复误判问题:^(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*$。
支持c字符的最终正则
写法1:环视实现(逻辑最清晰)
^(?=([^a]*a[^a]*a)*[^a]*$)(?=([^b]*b[^b]*b)*[^b]*$)[abc]*$
规则说明:
^、$分别匹配字符串的首尾,确保校验覆盖全字符串- 第一个正向先行断言
(?=([^a]*a[^a]*a)*[^a]*$):要求整个字符串中a的出现次数为偶数 - 第二个正向先行断言
(?=([^b]*b[^b]*b)*[^b]*$):要求整个字符串中b的出现次数为偶数 - 末尾的
[abc]*$限制字符串仅可出现a、b、c三类字符
写法2:基于原有逻辑扩展
如果要沿用你最初的奇偶配对逻辑,只需要在所有字符间隙插入可选的c*即可,最终正则为:
^c*(?:(?:ac*a|bc*b)*c*(?:(?:ac*b|bc*a)c*(?:ac*b|bc*a)c*)*)*c*$
内容的提问来源于stack exchange,提问作者user15399344
相关产品推荐
相关产品推荐

