【问题标题】:How to get an array from the result of a regex如何从正则表达式的结果中获取数组
【发布时间】:2013-01-31 08:34:46
【问题描述】:

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

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”的情况下这样做,但是使用“/([)((?:[a-z][a-z]+))(\d+)(])/g”它不起作用。 ..

一些想法?

问候

【问题讨论】:

  • 这个正则表达式应该更好,不是吗? (\[[A-Z][a-z]+\d+\])
  • ((?:[a-z][a-z]+)) ... 内部的非捕获组似乎是多余的。

标签: javascript regex arrays


【解决方案1】:

首先,我将简化表达式:

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]);
});

【讨论】:

  • 如果我将 txt 扩展为 "[Eig5]=='test' AND [Eig4]>=[Eig3]*2" 它只会找到 [Eig5] 和 [Eig4],而不是 [ Eig3]...有什么想法吗?
  • "[Eig5]=='test' AND [Eig4]&gt;=[Eig3]*2".match(re) 给我["[Eig5]", "[Eig4]", "[Eig3]"] @Stev
【解决方案2】:

你应该修改

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

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

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

【讨论】:

    猜你喜欢
    • 2020-04-23
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多