首页 > 解决方案 > 如何为两个对应模式之间的共享字符编写正则表达式?

问题描述

我将在“caaab”中找到所有“aa”子字符串。所以,我使用了以下正则表达式。

/aa/g

使用引用的表达式,我希望 JavaScript 的match方法返回两个对应的模式。如您所见,中间的共享“a”导致两个“aa”模式!尽管如此,它只返回第一个。正则表达式有什么问题,我该如何解决?

let foundArray=d.match(/aa/g);

标签: javascriptregex

解决方案


这是解决此问题的一种方法。我们可以先记录下输入字符串的长度,以备后用。然后,a(?=a)用空字符串进行全局正则表达式替换。一个接一个,这将替换输入中每个出现的子字符串aa。然后,我们可以将输出的长度与输入的长度进行比较,以确定发生了多少次aa

var input = "caaab";
var sLen = input.length;
var output = input.replace(/a(?=a)/g, "");
var eLen = output.length;
console.log("There were " + (sLen - eLen) + " occurrences of aa in the input");

请注意,您遇到的困难与 JavaScript 的正则表达式引擎的行为有关。如果您替换aa,它将消耗所有内容,因此可能会消耗a下一个连续aa匹配的第一个字母。使用a(?=a)可以解决这个问题,因为前瞻(?=a)不会消耗下一个a.


推荐阅读