You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现正则表达式的重叠模式匹配?以/aa/g匹配'aaa'为例

解决正则重叠匹配的问题

这是个很常见的正则匹配重叠结果的问题,我来给你拆解下原因和解决方案~

为什么原正则只匹配一次?

你使用的/aa/g属于消耗式匹配:当它匹配到第一个aa(字符串中位置0到1的两个a)后,正则引擎会把匹配结束的位置(也就是索引2)作为下一次匹配的起始点。此时剩下的字符只有索引2的单个a,自然无法再匹配aa,所以最终只得到一个结果。

实现重叠匹配的方案

要获取重叠的aa匹配结果,我们需要用到零宽度正向预查(Positive Lookahead)——这种断言不会“消耗”字符,匹配后不会移动到匹配结束的位置,而是停留在当前位置继续下一次匹配。

具体正则写法

可以使用带捕获组的正向预查正则:

/(?=(aa))/g

代码示例(以JavaScript为例)

const str = 'aaa';
const regex = /(?=(aa))/g;
const matches = [];
let matchResult;

// 遍历所有匹配
while ((matchResult = regex.exec(str)) !== null) {
  matches.push(matchResult[1]); // 提取捕获组中的aa
}

console.log(matches); // 输出:['aa', 'aa']

正则解释

  • (?=(aa)):正向预查断言,它会检查当前位置后面是否存在连续的两个a,但不会把这两个a标记为“已消耗”的字符。
  • 第一次匹配时,引擎在索引0的位置发现后面是aa,通过捕获组(aa)得到第一个匹配结果;
  • 下一次匹配从索引1开始,同样发现后面是aa,得到第二个匹配结果;
  • 当引擎走到索引2时,后面没有足够的字符,匹配结束。

另一种思路(反向预查)

如果你习惯用反向预查,也可以这样写:

/(?<=a)a/g

这个正则会匹配每个前面有a的单个a(也就是字符串中索引1和2的a),你可以结合匹配位置,截取每个匹配位置前一个a和当前a组成aa,不过这种方式不如正向预查直接。

内容的提问来源于stack exchange,提问作者Andrej Novák

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:31:04