获取正则表达式中匹配字符串的索引

Getting index of matched strings in Regex Expression

本文关键字:字符串 索引 正则表达式 获取      更新时间:2023-09-26

我试图从值的for循环内获得匹配字符串的索引,以匹配字符串与…

的例子:

var arr = ["foo", "bar"],
    arr2 = [];
for(var j=0;j<arr.length;j++){
    var str = "foo bar flub alien alcohol foo bar foo",
    re = new RegExp("("+arr[j]+")", "ig"),
    //method = str.match(re) || re.exec(str),
    obj = {match: method, index: method.index};
    arr2.push(obj);
    console.log(obj);
}

我知道这目前不起作用,我正在努力找出解决这个问题的方法。每次都卡住了,我来到堆栈溢出社区问你,当我试图实现以下(对于arr2的结果)时,我做错了什么:

[{string: "foo", index: 0}, 
 {string: "foo", index: 27}, 
 {string: "bar", index: 4},
 {string: "bar", index: 30}]

您可以使用以下代码:

var arr = ["foo", "bar"];
arr2 = [];
for(var j=0;j<arr.length;j++){
 var str = "foo bar flub alien alcohol foo bar foo";
 re = new RegExp(arr[j], "ig");
 while ((m = re.exec(str))!== null) {
   if (m.index === re.lastIndex) {
      re.lastIndex++;
   }
   obj = {match: m[0], index: m.index};
   arr2.push(obj);
   console.log(obj);
 }
}

我改变了

:

  • 正则表达式定义(删除不必要的捕获组)
  • 使用exec访问多个匹配项。

m.index为字符串中匹配项的基于* 0的索引。* ( MDN )我使用m[0]访问组0以获得匹配的整个文本,因为没有设置捕获组(模式中没有未转义的圆括号)。

由于您正在使用全局正则表达式,您应该继续调用exec,直到没有匹配。您可以使用while循环来完成此操作。

var arr = ["foo", "bar"],
    arr2 = [],
    str = "foo bar flub alien alcohol foo bar foo";
for(var j=0; j<arr.length; j++) {
    var re = new RegExp(arr[j], "ig"),
        match;
    while(match = re.exec(str))
        arr2.push({string: match[0], index: match.index});
}