3

これは、私がスタックについて尋ねた最初の質問です。なぜなら、私は本当に正規表現に頭を悩ませることができないからです。私は大学図書館の高度なカタログ検索を仕掛けようとしています。これにより、常連客が資料タイプのいくつかの異なるカテゴリで「サッカー」などを検索した後、「検索を変更する」ボタンを押すと、以前のすべての検索パラメーターを含むフォームに戻ります。思い出した。これは古い独自のシステムであるため、デフォルトでは、利用者を検索フォームに戻しますが、最初からやり直すように強制します。

ただし、場所の文字列にはまだすべてのパラメーターが含まれているため、それを正規表現し、フォームに JS を入力する必要があります。文字列は次のようになります。

/search~S13/X?NOSRCH=(football)&m=i&m=g&m=r&m=r&m=1&m=5&m=g&m=o&m=7&m=j&m=i&m=2&m=3&m=q&m=m&SORT=D&SUBKEY=(football)

上記の例よりもはるかに多く発生する可能性がある m の値を取得したいと思います。これまでのところ、私はこれをやっています:

var str = location.search.match(/m.*?&/g);

返す

"m=i&", "m=g&", "m=r&", "m=r&", "m=1&", "m=5&", "m=g&", "m=o&", "m=7&", "m=j&", "m=i&", "m=2&", "m=3&", "m=q&", "m=m&"

iの値だけを取得するにはどうすればよいでしょうm=i&か。

4

4 に答える 4

1

あなたの質問を誤解しているかもしれませんが、JavaScript を使用している場合、RegEx は必要ないと思います。

いずれにせよ、最初に文字列の検索部分を取得し、先頭から疑問符を切り取ります。たとえば、

var str = window.location.search.slice(1);

次に、RegEx ルートまたは単純な JavaScript ルートのいずれかに進むことができます。

正規表現:

非キャプチャ グループとキャプチャ グループ (括弧内) を使用してパターンを作成します。

var regexPttrn = /(?:m\=)([^&=]+)/ig;

最初のグループは?:文字を探すために使用しますm=。それらが見つかると、アンパサンドまたは等号ではない連続した文字のグループをキャプチャします。

残念ながら、execこれを行うにはメソッドを使用する必要があり、ループ内でも使用する必要があります。これexecは、一度に 1 つの一致しか行わず、使用する前に返された配列に必要なプロパティがあることを確認する必要があるためです。

ジャバスクリプト:

さらに良いことに、RegEx を使用する代わりにstr、アンパサンドを区切り記号として使用して、上記で定義したようにさまざまなプロパティの配列に分割します。

var arr = str.split('&');

これにより"m=i""m=g"、 などの文字列の配列が作成されます。

arr次に、ループを実行し、等号を区切り文字として使用して各要素を分割することにより、これらをそれぞれキーと値のペアに分割します。

var pairs = [];
for (var i = 0; i < arr.length; i += 1) {
    pairs[i] = arr[i].split("=");
}

このようにして、構造的に次のようないくつかの小さな配列を含む配列を取得します。

[
    [ "NOSRCH", "FOOTBALL" ],
    [ "m", "i" ],
    [ "m", "g" ],
    /* and so on, until... */
    [ "EY", "(football)" ]
]

の値だけを取得mするには、上記のループを変更して、次のようにそれらの値だけの配列を作成します。

var pairs = [],
    m_results = [];
for (var i = 0; i < arr.length; i += 1) {
    pairs.push(arr[i].split("="));
    if (pairs[i][0] === "m") {
        m_results.push(pairs[i][1]);
    }
}

配列には、検索文字列にm_results関連付けられているすべての値が含まれます。m

全部でわずか 10 行のコードで、コメント、デバッグ、および再利用がはるかに簡単で、面倒な RegEx パターンを試すよりもはるかに簡単だと思います。

于 2013-01-30T17:38:46.233 に答える
1

これはからのものなので、これlocation.searchを行うことができます:

location.search.substring(1).split('&').filter(function (e) {
    return /^m=/.test(e);
}).map(function (e) {
    return e.substring(2); 
});

1 つ目は、 のクエリ文字列からsubstring削除することです。?location.search

于 2013-01-30T17:33:21.350 に答える
0
var s = '/search~S13/X?NOSRCH=(football)&m=i&m=g&m=r&m=r&m=1&m=5&m=g&m=o&m=7&m=j&m=i&m=2&m=3&m=q&m=m&SORT=D&SUBKEY=(football)';
s.split(/&/).map(function(x) {
  return x.split(/=/);
}).filter(function(x) {
  return x[1] == 'i';
}); // => [['m', 'i'], ['m', 'i']]
于 2013-01-30T18:07:50.637 に答える