我有这段文字
txt = "Local residents o1__have called g__in o22__with reports...";
在这个任务中,我需要获取在每个 o
和 __
之间的数字列表。如果我执行以下操作:
txt.match(/o([0-9]+)__/g);
我会得到。["o1__", "o22__"]
但是我想要
["1", "22"]
我该怎么做?
我有这段文字
txt = "Local residents o1__have called g__in o22__with reports...";
在这个任务中,我需要获取在每个 o
和 __
之间的数字列表。如果我执行以下操作:
txt.match(/o([0-9]+)__/g);
我会得到。["o1__", "o22__"]
但是我想要
["1", "22"]
我该怎么做?
请参考这个问题:
txt = "Local residents o1__have called g__in o22__with reports...";
var regex = /o([0-9]+)__/g
var matches = [];
var match = regex.exec(txt);
while (match != null) {
matches.push(match[1]);
match = regex.exec(txt);
}
alert(matches);
.exec()
,并带有g标志重复调用它,以便像这样获取连续的匹配:var txt = "Local residents o1__have called g__in o22__with reports...";
var re = /o([0-9]+)__/g;
var matches;
while ((matches = re.exec(txt)) != null) {
alert(matches[1]);
}
在正则表达式对象中,前一个匹配的状态被存储为lastIndex
属性,下一次匹配会从该属性指定的位置开始。
你可以点击这里查看演示:http://jsfiddle.net/jfriend00/UtF6J/
使用这种方式的正则表达式在这里进行了描述:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/exec。
regex.exec()
(它必须作为循环的一部分被多次调用),如果匹配到任何内容,它将进入无限循环,因为一旦 while 循环开始,match
的值就不会改变。 - jfriend00g
选项,那么每次调用 .test()
和 .exec()
方法时都会将匹配位置向下移动一位。这个状态存储在正则表达式对象本身中。如果需要,你可以通过将正则表达式的 .lastIndex
属性设置为 0
来重置该状态。 - jfriend00/o([0-9]+?)__/g
var rx = new RegExp( /o([0-9]+?)__/g );
var txt = "Local residents o1__have called g__in o22__with reports...";
var mtc = [];
while( (match = rx.exec( txt )) != null ) {
alert( match[1] );
mtc.push(match[1]);
}
Jek-fdrv在评论中指出,如果在while循环之前调用rx.test,则会跳过一些结果。这是因为RegExp对象包含一个lastIndex字段,它跟踪字符串中最后一个匹配的索引。当lastIndex更改时,RegExp将从其lastIndex值开始匹配,因此字符串的一部分将被跳过。以下是一个小例子:
var rx = new RegExp( /o([0-9]+?)__/g );
var txt = "Local residents o1__have called g__in o22__with reports...";
var mtc = [];
console.log(rx.test(txt), rx.lastIndex); //outputs "true 20"
console.log(rx.test(txt), rx.lastIndex); //outputs "true 43"
console.log(rx.test(txt), rx.lastIndex); //outputs "false 0" !!!
rx.lastIndex = 0; //manually reset lastIndex field works in Chrome
//now everything works fine
while( (match = rx.exec( txt )) != null ) {
console.log( match[1] );
mtc.push(match[1]);
}