0

私が行った場合:

"A first sentence. A second sentence".match(/A\s([^\s]*)\ssentence/g)

これは次を返します:

["A first sentence", "A second sentence"]

そして、私が使用する場合:

RegExp.$1

次に、最後の最初の括弧のキャプチャを取得するだけなので、"second".

配列を取得したいと思い["first","second"]ます。出来ますか?

4

3 に答える 3

2

ループで実行し、コレクションを構築する必要があります。

var str = "A first sentence. A second sentence",
    regex = /A\s([^\s]*)\ssentence/g,
    result = [],
    match;

while (match = regex.exec(str)) {
    result.push(match[1]);
}

console.log(result);

正規表現はgグローバルであるため、最後の一致の位置を記憶し、次に正規表現が使用されるときにそこから開始します。そのため、一致が見つからなくなるまでループが続きます。

ループ内では、サブグループをresult配列に追加するだけです。


.replaceこの目的のために使用するのが好きな人もいます。

var str = "A first sentence. A second sentence",
    regex = /A\s([^\s]*)\ssentence/g,
    result = [];

str.replace(regex, function(str, g1) {
    result.push(g1);
});

console.log(result);

実際には文字列の置換を行っているわけではなく、一致が見つからなくなるまで検索を繰り返すという事実を利用しているだけです。

于 2012-11-04T18:38:33.950 に答える
1

簡単にするために、次のように定義します

function runRegex(str, pat, ret){ 
  return str.match(pat).map(function(a){ 
    a.match(pat); var b; eval("with(RegExp) b = " + ret + ";"); return b;
  });
}

必要なパラメータで使用します

runRegex("A first sentence. A second sentence", /A\s([^\s]*)\ssentence/g, "$1");

このデモを確認してください。


このソリューションの利点は、次のような複雑な戻り式を使用できることです。

runRegex("A first sentence. A second sentence", /A\s([^\s]*)(\ssentence)/g, "$1+$2"));
于 2012-11-04T19:01:05.547 に答える
1

gサブパターンを取得するには、修飾子なしで正規表現を再実行する必要があります。何かのようなもの:

"A first sentence. A second sentence".match(/A\s([^\s]*)\ssentence/g)
    .map(function(a) {return a.match(/A\s([^\s]*)\ssentence/);})

(が存在するかシムされていると仮定Array.prototype.mapします - それ以外の場合はループを使用します)

于 2012-11-04T18:39:13.477 に答える