在RegEx中访问多个捕获(新手事......)

时间:2012-06-07 21:06:28

标签: javascript regex capture

在这个正则表达式中多次捕获我必须添加“g”标志来获取所有项目......

“aaa bbb ccc \ n.000。\ n \ n.111。\ n sd555 dsf \ n.222。\ n ddd”.match(/^。(。*)。$ / gm)

当我添加“g”(全局)标志时?如何访问捕获的组...应该有3个像[“000”,“111”,“222”]但我不知道如何访问它们...我一直得到[“.000。”,“。111”。“,”。222。“]<<注意单词之前和之后的点

3 个答案:

答案 0 :(得分:5)

如果您想在全局正则表达式中获取捕获组,则不幸的是,您无法使用match。相反,您需要在正则表达式上使用exec

var myregex = /^.(.*).$/gm;
var result, allMatches = [];
while((result = myregex.exec(mystring)) != null) {
    var match = result[1]; // get the first match pattern of this match
    allMatches.push(match);
}

使用全局正则表达式,match返回所有匹配项的数组,并且永远不会返回捕获组。 exec返回单个匹配及其所有捕获组。要获得所有匹配项,您必须多次调用exec,直到它最终返回null

注意 exec依赖于正则表达式维护状态,因此必须将正则表达式保存在变量中:

while((result = /^.(.*).$/gm.exec(mystring)) != null) // BAD and WRONG!

这是错误的,因为每个循环都有一个新的正则表达式,它不知道它应该返回这个循环的匹配。 (或者,更准确地说,它不知道前一个正则表达式的lastIndex。)

答案 1 :(得分:0)

str.match(re)的返回结果是一个数组。

在这里演示。 http://jsfiddle.net/rXgQa/

var re = /^.(.*).$/gm;
var str = "aaa bbb ccc \n.000.\n \n.111.\n sd555 dsf \n.222.\n ddd ";
var matches = str.match( re );
if( matches ){
    document.body.innerHTML += matches.join( '<br/> ' );
}​

输出:

aaa bbb ccc // matches[0]
.000.     // matches[1]
.111.     // matches[2]
sd555 dsf // matches[3]
.222.     // matches[4]
ddd       // matches[5]

更新

以下是我对问题第二部分的回答。 题: 如何摆脱数字前后的点?

我的回答: 我只是遍历匹配并用空字符串替换点。 此外,您的正则表达式是错误的,因为您需要转义点。

更新 jsfiddle演示:http://jsfiddle.net/rXgQa/1/

var re = /^\.([^\.]+)\.$/gm;
var lines = "aaa bbb ccc \n.000.\n \n.111.\n sd555 dsf \n.222.\n ddd ";
var matches = lines.match( re );
var i = (matches||[]).length;
while( i-- ){
    matches[i] = matches[i].replace( /\./g, '' );
}

document.body.innerHTML += matches.join( '<br/>' );

答案 2 :(得分:0)

在FireBug中:

var hello = "aaa bbb ccc \n.000.\n \n.111.\n sd555 dsf \n.222.\n ddd ".match( /^.(.*).$/gm );
console.dir(hello);

然后你可以使用hello[n],其中n是你想要的匹配,例如`hello [1]。

但是,如果想要匹配某些内容,则需要修改正则表达式。