1

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

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]

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

一些想法?

问候

4

2 回答 2

2

你应该修改

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

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

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

于 2013-01-31T08:38:59.927 回答
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]);
});
于 2013-01-31T08:49:34.333 回答