如何编写正则提取字符串中所有ABA类对称结构的匹配项
正则匹配对称结构子串解决方案
问题说明
需要匹配中间为单个不同字符、左右两侧为完全相同的同字符序列的子串,支持字符两侧存在其他无关字符、适配所有字符类型。原有正则/(([a-z])\2*)((?!\2)[a-z])\1/g仅能匹配最长的符合条件的子串,无法捕获所有更短的重叠子串,且仅支持小写字母。
可用正则
/(?=((.)\2*)(?!\2)(.)\1)/g
若需要支持匹配换行符,可添加s修饰符:
/(?=((.)\2*)((?!\2).)\1)/gs
逻辑说明
- 零宽正向预查
(?=...):不会消耗匹配位置,可捕获所有重叠存在的符合要求的子串 - 分组1
((.)\2*):匹配左侧由相同字符组成的任意长度序列,分组2存储左侧的重复基准字符 (?!\2)(.):匹配中间单个字符,通过负向预查保证该字符与左侧基准字符不同\1:匹配右侧和左侧序列完全一致的部分- 全局修饰符
g:支持匹配全部符合要求的子串 - 通配符
.替代原有的[a-z],适配所有字符类型(字母、数字、符号、中文等)
调用示例(JavaScript)
由于使用了预查逻辑,匹配结果需要从每个匹配项的第一个捕获组提取:
function matchTargetSubstrings(input) { const regex = /(?=((.)\2*)(?!\2)(.)\1)/g; const result = []; let match; while (match = regex.exec(input)) { result.push(match[1]); } return result; } // 测试用例 console.log(matchTargetSubstrings('aaabaaa')); // 输出:['aba', 'aabaa', 'aaabaaa'] console.log(matchTargetSubstrings('mnonnopoo')); // 输出:['non', 'opo'] console.log(matchTargetSubstrings('aaaasaaaaa')); // 输出:['asa', 'aasaa', 'aaasaaa', 'aaaasaaaa'] console.log(matchTargetSubstrings('aaabaazsaaasbbabba')); // 输出:['aba', 'aabaa', 'bab', 'bbabb']
内容的提问来源于stack exchange,提问作者Sebi
相关产品推荐
相关产品推荐

