5

私はこのようなコードを試しました

var match = req.url.match(/^\/user\/(.+)/)

そしてそのようなURLを渡しました"___http://someurl/user/jane"

一致が次の要素を持つ配列に初期化されたことが判明したため

match[0]='/user/jane'
match[1]='jane'

私は単一の要素、つまりの最初の要素を期待していましたmatch[0]。2番目の文字列が返されたのはなぜですか-正規表現と一致していないようです。

JavaScriptの使用経験は最小限で、周りを見回しても説明が見つかりませんでした。これの説明に感謝します

ありがとう

4

1 に答える 1

10

フラグなしの正規表現と同じ戻り値を持つString.match、またはそれ以上のものを見てください。RegExp.execString.matchg

返された配列には、最初の項目として一致したテキストがあり、次に、キャプチャされたテキストを含む、一致したキャプチャ括弧ごとに 1 つの項目があります。

つまり、丸括弧¹ の間のグループがキャプチャ グループになります。完全一致のみが必要な場合は、次を使用できます。

var match = req.url.match(/^\/user\/.+/)[0];
console.log(match); //logs: "/user/jane"

これにより、一致全体が ( index で0) 抽出され、変数に返されますmatch。残りの配列は破棄されます。

注: 正規表現が一致しない可能性がある場合は、エラーを防ぐために完全な一致を抽出する前に、一致を返すかどうかをテストする必要があります。

var match = req.url.match(/^\/user\/.+/);
if (match !== null) {
    match = match[0];
    console.log(match); //"/user/jane"
} else {
    console.log("no match");
}

いじり回すためのライブデモは次のとおりです。

この場合は違いがないため、キャプチャ グループを削除しました。実際には問題ではなく、マイクロ最適化にすぎません。

正規表現のキャプチャ グループ/後方参照の詳細については、こちらを参照してください。


¹ 常にそうであるとは限りません。非キャプチャ グループにする修飾子 ( ?:)、先読み、後読みなどがありますが、これらはトピック外です。これらの詳細については、上記のリンク先のサイトを参照してください。

于 2013-03-18T21:38:50.673 に答える