使用正则表达式计算字符串中子字符串的所有出现次数

Counting all the occurrences of a substing in a string using regular expression

本文关键字:字符串 正则表达式 计算      更新时间:2023-09-26

我见过很多这样的例子,但没有帮助。我有以下字符串:

var str = 'asfasdfasda'

我想提取以下

asfa asfasdfa asdfa asdfasda asda 

即所有以"a"开头、以"a)结尾的子字符串

这是我的正则表达式

/a+[a-z]*a+/g

但这总是只给我一个匹配:

[ 'asdfasdfsdfa' ]

有人可以指出我执行过程中的错误。

谢谢。

编辑已更正不需要的子字符串。请注意,重叠和重复的子字符串也是必需的。

为了捕获重叠的匹配,您需要前瞻regex并获取捕获的组#1和#2:

/(?=(a.*?a))(?=(a.*a))/gi

RegEx演示

解释:

CCD_ 1被称为前瞻,它是像锚或单词边界一样的零宽度断言。它只是向前看,但不向前移动regex指针,从而使我们能够在组中获取重叠的匹配。

查看更多关于查找的信息


代码:

var re = /(?=(a.*?a))(?=(a.*a))/gi;
var str = 'asfasdfasda';
var m; 
var result = {};
while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex)
        re.lastIndex++;
    result[m[1]]=1;
    result[m[2]]=1;
}
console.log(Object.keys(result));
//=> ["asfa", "asfasdfasda", "asdfa", "asdfasda", "asda"]

解析器不会转到磁带上的前一个状态以匹配再次启动的a。

var str = 'asfaasdfaasda'; // you need to have extra 'a' to mark the start of next string
var substrs = str.match(/a[b-z]*a/g); // notice the regular expression is changed.
alert(substrs)

您可以这样计数:

var str = "asfasdfasda";
var regex = /a+[a-z]*a+/g, result, indices = [];
while ((result = regex.exec(str))) {
     console.log(result.index); // you can instead count the values here.
}