任务是找出是否有任何系列的(即"111"
)和每场比赛的输出:
"111"
它将是2
); 我使用以下正则表达式:/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;
然后我为每场比赛定义:
position
为input.indexOf(mg[i][0])
; number of successive digits
为mg[i][1].length
; 我该怎么做?我应该使用什么样的regexp或方法?
或者,也许,有一种完全不同的技术,我不熟悉?
PS:如果我说得对,this one的问题不重复,因为它是关于"如何" ,而不是&# 34,为什么"
答案 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()
将所有捕获的文本保存在匹配数据对象中。
以下是示例演示:
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;