我将在“caaab”中找到所有“aa”子字符串。所以,我使用了以下正则表达式。
/aa/g
使用引用的表达式,我希望 JavaScript 的match方法返回两个对应的模式。如您所见,中间的共享“a”导致两个“aa”模式!尽管如此,它只返回第一个。正则表达式有什么问题,我该如何解决?
let foundArray=d.match(/aa/g);
我将在“caaab”中找到所有“aa”子字符串。所以,我使用了以下正则表达式。
/aa/g
使用引用的表达式,我希望 JavaScript 的match方法返回两个对应的模式。如您所见,中间的共享“a”导致两个“aa”模式!尽管如此,它只返回第一个。正则表达式有什么问题,我该如何解决?
let foundArray=d.match(/aa/g);
这是解决此问题的一种方法。我们可以先记录下输入字符串的长度,以备后用。然后,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.
正如评论中提到的那样,正则表达式的设计方式是:
它完全按预期工作;一旦它消耗了一个角色,它就会移动过去
匹配不重叠,这不是 js 的限制,它只是正则表达式的工作方式。
蒂姆的现有答案已经这样做了,但可以简化如下:
match = "caaab".match(/a(?=a)/g);
console.log(match);
这是找到一个a后跟另一个a(不作为匹配的一部分返回)。所以从技术上讲,它发现:
caaab
^ first match, single character
^ second match, single character