1

イニシャルのシーケンス、つまりシーケンス全体を一致させたいのですが、次の例の2番目の正規表現は正しく実行します。「グローバル」フラグが必要なのはなぜですか?最初のものも、文字列全体とのみ一致する必要がありますよね?(とのため^$

abc = "A.B.C."
abc.match(/^([A-Z]\.)+$/) // result: ["A.B.C.", "C."]
abc.match(/^([A-Z]\.)+$/g) // result: ["A.B.C."]

ありがとう!

4

3 に答える 3

3

パレンにはが含まれていないため+です。したがってabc.match(/^([A-Z]\.)+$/)、そうすると、親は最初のにのみ一致し[A-Z]\.ます。

あなたが望むマッチを得るために、あなたはg旗を必要としません。結果として使用match[0]してください。

var result = abc.match(/^([A-Z]\.)+$/)
if (result) {
    var fullMatch = result[0];
}

ここでの作業デモ:http://jsfiddle.net/jfriend00/PXF6U/

gフラグが観察したように応答を変更する理由の詳細については、Bergiの回答を参照してください。

于 2012-05-30T15:51:21.043 に答える
2

数量詞(この場合+)をキャプチャサブパターン(([A-Z]\.))に適用すると、繰り返されるサブパターンの最後のインスタンスのみがキャプチャされます(これは結果配列のインデックス1であり、新しいものが見つかるたびに上書きされるため) 。

個々の試合を取得したい場合は、次を試してください。

abc.match(/[A-Z]\./g);

これはあなたに与えるでしょう:

["A.","B.","C."]
于 2012-05-30T15:59:46.827 に答える
2

.match()メソッドのドキュメントを参照してください:

正規表現に g フラグが含まれていない場合、 は と同じ結果を返しますregexp.exec(string)

これはあなたの「予期しない結果」です。説明を参照してください: キャプチャ グループ、一致した文字列、一致したインデックスなどを含む配列を返し"C."ます。2 番目の配列項目として得られるのは、式の最後のキャプチャです([A-Z]\.)。それでも、文字列全体に 1 回しか一致しませんでした。

正規表現に g フラグが含まれている場合、メソッドはすべての一致を含む配列を返します。一致するものがない場合、メソッドは null を返します。

「すべての一致」の配列には、一致するため、1 つの項目しかありません^...$

したがって、使用する正規表現に関係なく、コードは次のようになります。

var result = abc.match(regex);
if (result) // != null
    return result[0];
else
    // no match found
于 2012-05-30T15:57:41.717 に答える