1

最初に例、次に質問...

例 1) '?sort=alpha&direction=asc' の非グローバル マッチ

'?sort=alpha&direction=asc'.match(/([^?&=]+)(=([^&]*))?/);

出力:

// ['sort=alpha', 'sort', '=alpha', 'alpha']

例 2) '?sort=alpha&direction=asc' のグローバル マッチ

'?sort=alpha&direction=asc'.match(/([^?&=]+)(=([^&]*))?/g);

出力:

// ['sort=alpha', 'sort', '=alpha', 'alpha']

例 3) '?sort=alpha&direction=asc' のグローバル マッチ置換

getRequestParameters: function () {
    var query_string = {},
        regex = new RegExp('([^?=&]+)(=([^&]*))?', 'g');

    '?sort=alpha&direction=asc'.replace(regex, function(match, p1, p2, p3, offset, string) {
        console.log(match, p1, p2, p3, offset, string);

        query_string[p1] = p3;
    });
}

出力:

// sort=alpha sort =alpha alpha 1 ?sort=alpha&direction=asc
// direction=asc direction =asc asc 12 ?sort=alpha&direction=asc 


私の質問

これを自分で考え出すことができたかどうかはわかりませんが、解決策を「生きる」ことは決してなく、理由の背後にある韻を理解しなければなりません. 特定の試合は「十分に」理解していると思います。以下の答えのいくつかを知っていると思いますが、推測をしたり、賢い人から学ぶことはしません。

  1. なぜ 1) と 2) は同じなのですか? (または彼らですか?)
  2. 1) と 2) の「sort=alpha」はどういう意味ですか?
  3. 2) が並べ替えと方向の両方のパラメーターを返さないのはなぜですか?
  4. 3) .replace() で繰り返すのは何ですか?
  5. .replace() なしで N 個のパラメータをキャプチャする方法はありますか?

ありがとう!

アップデート

var regex = new RegExp('([^?&=]+)(=([^&]*))?');
regex.exec('?sort=alpha&direction=asc');
// Chrome 21 - ["sort=alpha", "sort", "=alpha", "alpha"]

var regex = new RegExp('([^?&=]+)(=([^&]*))?', 'g');
regex.exec('?sort=alpha&direction=asc');
// Chrome 21 - ["sort=alpha", "sort", "=alpha", "alpha"]

'?sort=alpha&direction=asc'.match(/([^?&=]+)(=([^&]*))?/);
// Chrome 21 - ["sort=alpha", "sort", "=alpha", "alpha"]

'?sort=alpha&direction=asc'.match(/([^?&=]+)(=([^&]*))?/g);
// Chrome 21 - ["sort=alpha", "direction=asc"]

var regex = new RegExp('([^?&=]+)(=([^&]*))?', 'g');
regex.lastIndex = 11;
regex.exec('?sort=alpha&direction=asc');
// Chrome 21 - ["direction=asc", "direction", "=asc", "asc"]

要約すると、例 3) は依然として正しいですが、より適切な回答については、この回答にアクセスしてください。

更新を終了する

参照と Steven Benner への感謝:

4

1 に答える 1

3

最初に回答、その後に質問:

  1. Chrome 21 と Firefox 14 の両方でバージョンを取得["sort=alpha", "direction=asc"]するため、gまったく同じではありません。
  2. から最初に返される値matchは、一致した文字列全体です (この場合、アンパサンド、疑問符、または等号以外の 1 つまたは複数の文字の後に、オプションで等号とアンパサンド以外の 0 個以上の文字が続きます)。
  3. (#1 への回答を参照) - これらのテストを実行しているブラウザーは何ですか?
  4. replace文字列で見つかった各一致を反復しています。
  5. 複数の呼び出しをexec使用するか、既存の正規表現を使用します。

    > '?sort=alpha&direction=asc&another=value'.match(/([^?&=]+)(=([^&]*))?/g);
    ["sort=alpha", "direction=asc", "another=value"]
    

最初の質問で提供した結果が得られたブラウザは何ですか?

于 2012-08-23T03:08:31.327 に答える