在Regex Expression中获取匹配字符串的索引

时间:2015-08-07 22:28:36

标签: javascript regex

我试图从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);
}

我知道这目前无效,我正在尝试找出解决此问题的方法。每次都卡住了,我来到Stack Overflow社区问你,当我试图实现以下目的时,我做错了什么(arr2的结果):

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

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码:

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以获取匹配的整个文本,因为没有设置捕获组(模式中没有未转义的圆括号)。

答案 1 :(得分: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});
}