global-RegExp`Array.prototype.match()`的意外行为

时间:2016-03-24 22:32:40

标签: javascript regex match

任务是找出是否有任何系列的(即"111")和每场比赛的输出:

  1. 匹配在输入中的位置;
  2. 连续的数量(即"111"它将是2);
  3. 我使用以下正则表达式:/1(1+)/g/1(1+)/;不幸的是,它们都没有正常工作:

    var m = "11110110".match(/1(1+)/); // ["1111", "111"]
    // `m[0]` is the first match and `m[1]` is a capture group of the first match;
    // error: there is no second match
    
    var mg = "11110110".match(/1(1+)/g); // ["1111", "11"]
    // `mg[0]` is the first match and `mg[1]` is the second match;
    // error: there are no capture groups
    

    "11110110"输入的情况下,我需要像:

    var mg = "11110110".__(/1(1+)/g); // [["1111", "111"], ["11", "1"]]
    // `mg[0][0]` is the 1st match, `mg[0][1]` is its capture group,
    // `mg[1][0]` is the 2nd match and `mg[1][1]` is its capture group;
    

    然后我为每场比赛定义:

    1. positioninput.indexOf(mg[i][0]);
    2. number of successive digitsmg[i][1].length;
    3. 我该怎么做?我应该使用什么样的regexp或方法?
      或者,也许,有一种完全不同的技术,我不熟悉?

      PS:如果我说得对,this one的问题不重复,因为它是关于"如何" ,而不是&# 34,为什么"

2 个答案:

答案 0 :(得分:1)

您可以使用String的exec方法。 exec返回具有索引属性的对象:

var str = '111001111';
var re = /(1+)/g;
while ((match = re.exec(str)) != null) {
    console.log(match[0]); // capture group
    console.log(match[0].length); // length
    console.log(match.index); // start index position
}

答案 1 :(得分:0)

您可以使用RegExp#exec()将所有捕获的文本保存在匹配数据对象中。

以下是示例演示:

  • 所有匹配项(仅匹配数据对象中的第0个元素m[0]
  • 所有索引(最后重新索引减去匹配长度,re.lastIndex - m[0].length
  • 连续数字的长度(第一个捕获组值的长度m[1].length

您可以根据自己的需要稍后进行修改。



var s = "11110110"; 
var re = /1(1+)/g;
var pos = [], numOfSucDigits = [], matches = [];
while ((m=re.exec(s)) !== null) {
  matches.push(m[0]);
  numOfSucDigits.push(m[1].length);
  pos.push(re.lastIndex - m[0].length);
}
document.body.innerHTML = "Matches: " + JSON.stringify(matches) + "<br/>";
document.body.innerHTML += "Count of SD: " + JSON.stringify(numOfSucDigits) + "<br/>";
document.body.innerHTML += "Indices: " + JSON.stringify(pos);
&#13;
&#13;
&#13;