如何从正则表达式的结果中获取数组

时间:2013-01-31 08:34:46

标签: javascript regex arrays

我无法从正则表达式匹配的结果中获取数组:

var txt = '[Eig2]=>100 [Eig1]=="test"';
var reg = '(\\[)((?:[a-z][a-z]+))(\\d+)(\\])';
var m = txt.match(new RegExp(reg, ["i"]));
if (m != null) {
    for (var i = 0; i < m.length; i++) {
        console.log(m[i]);
    }
} else {
    console.log("null");
}

它返回的内容:

[Eig2] 
[ 
Eig 
2 
]

我想要的是什么:

[Eig2]
[Eig1]

我可以在没有“新RegExp”的情况下进行,但是使用“/([)((?:[az] [az] +))(\ d +)(])/ g”它不起作用。 ..

一些想法?

此致

2 个答案:

答案 0 :(得分:2)

你应该修改

var m = txt.match(new RegExp(reg, ["i"]));

var m = txt.match(new RegExp(reg, ["ig"]));

g标志添加到正则表达式中,这意味着您要匹配字符串中的所有模式,而不是第一个及其子模式。

答案 1 :(得分:2)

首先,我会简化表达式:

var re = /\[([a-z]{2,}\d+)\]/ig;

我添加了/i用于不区分大小写的匹配和/g修饰符以匹配多个匹配项。然后你这样称呼它:

> txt.match(re);
  ["[Eig2]", "[Eig1]"]

提取第一个内存捕获:

var captures = [];

txt.replace(re, function($0, $1) {
    captures.push($1);
});

当然,.replace()在这里被滥用

然后,评估捕获:

> captures
  ["Eigh2", "Eigh1"]

<强>更新

构建内存捕获数组的一种更友好的方法:

var captures = [], match;

while ((match = re.exec(txt)) !== null) {
    captures.push(match[1]);
});