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 に答える