You need to enable JavaScript to run this app. 如何编写正则提取字符串中所有ABA类对称结构的匹配项
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则提取字符串中所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 13:36:03