イニシャルのシーケンス、つまりシーケンス全体を一致させたいのですが、次の例の2番目の正規表現は正しく実行します。「グローバル」フラグが必要なのはなぜですか?最初のものも、文字列全体とのみ一致する必要がありますよね?(とのため^
に$
)
abc = "A.B.C."
abc.match(/^([A-Z]\.)+$/) // result: ["A.B.C.", "C."]
abc.match(/^([A-Z]\.)+$/g) // result: ["A.B.C."]
ありがとう!
イニシャルのシーケンス、つまりシーケンス全体を一致させたいのですが、次の例の2番目の正規表現は正しく実行します。「グローバル」フラグが必要なのはなぜですか?最初のものも、文字列全体とのみ一致する必要がありますよね?(とのため^
に$
)
abc = "A.B.C."
abc.match(/^([A-Z]\.)+$/) // result: ["A.B.C.", "C."]
abc.match(/^([A-Z]\.)+$/g) // result: ["A.B.C."]
ありがとう!
パレンにはが含まれていないため+
です。したがって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の回答を参照してください。
数量詞(この場合+
)をキャプチャサブパターン(([A-Z]\.)
)に適用すると、繰り返されるサブパターンの最後のインスタンスのみがキャプチャされます(これは結果配列のインデックス1であり、新しいものが見つかるたびに上書きされるため) 。
個々の試合を取得したい場合は、次を試してください。
abc.match(/[A-Z]\./g);
これはあなたに与えるでしょう:
["A.","B.","C."]
.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