15

まさにタイトルが求めるもの。私の質問を説明しながら、いくつかの例を示します。

テスト文字列:

var test = "#foo# #foo# bar #foo#";

たとえば、間のすべてのテキストを抽出したいとします#(すべてfooの s ではないbar)。

var matches = test.match(/#(.*?)#/g);

上記のように使用.matchすると、すべての一致が保存されますが、見た目のキャプチャ グループは単に破棄されます。

var matches2 = /#(.*?)#/g.exec(test);

.execメソッドは、最初の結果の一致した文字列のみを配列の位置に返し、その一致の唯一0のキャプチャグループを位置に返すよう1です。

私はSO、Google、MDNを使い果たし、役に立たない答えを探しました。

.execそれで、私の質問は、それをループしてキャプチャされたグループを保存するために呼び出すよりも、一致したキャプチャグループのみを保存するより良い方法はありますarray.pushか?

上記のテストで予想される配列は次のようになります。

 [0] => (string) foo
 [1] => (string) foo
 [2] => (string) foo

純粋な JS および jQuery の回答が受け入れられます。追加の Cookie は、JSFiddle をconsole.log. =]

4

5 に答える 5

17

.exec次のように使用して、配列を作成できます

var arr = [],
    s = "#foo# #bar# #test#",
    re = /#(.*?)#/g,
    item;

while (item = re.exec(s))
    arr.push(item[1]);

alert(arr.join(' '));​

ワーキングフィドル

ここから見つかりました

まあ、それはまだループを持っています、あなたがループを望まないなら、私はあなたがと行かなければならないと思います.replace()。その場合、コードは次のようになります

var arr = [];
var str = "#foo# #bar# #test#"
str.replace(/#(.*?)#/g, function(s, match) {
                           arr.push(match);
                        });

MDN DOCのこれらの行を確認してください。これは、プロパティをexec更新する方法についてのクエリを説明しています。lastIndex

正規表現で「g」フラグを使用している場合は、execメソッドを複数回使用して、同じ文字列内の連続する一致を見つけることができます。

これを行うと、検索は正規表現のlastIndexプロパティで指定されたstrのサブストリングから開始されます(テストではlastIndexプロパティも進められます)。

于 2012-06-04T04:53:28.957 に答える
4

これがあなたが探している答えかどうかはわかりませんが、次のコードを試すことができます。

var matches = [];

var test = "#foo# #foo# bar #foo#";

test.replace(/#(.*?)#/g, function (string, match) {
    matches.push(match);
});

alert(JSON.stringify(matches));

それが役に立てば幸い。

于 2012-06-04T04:43:02.757 に答える
0

exec も同様に効率的ですが、別の考えです。

var s= "#foo# #foo# bar #foo#";
s= s.match(/#([^#])*#/g).join('#').replace(/^#+|#+$/g, '').split(/#+/);
于 2012-06-04T05:04:28.660 に答える