1

なぜこのコード(これがJSBinです):

var text = "T: 01202 870738";

var regex1 = /T: (.*)/;
var matches1 = text.match(regex1);

for(var i = 0; i < matches1.length; i++) {
  log("[" + i + "]: " + matches1[i]);
}

これをログに記録します:

[0]: T: 01202 870738
[1]: 01202 870738

そしてこのコード(私はgオプションを追加したことに注意してください):

var regex2 = /T: (.*)/g;
var matches2 = text.match(regex2);

for(var i = 0; i < matches2.length; i++) {
  log("[" + i + "]: " + matches2[i]);
}

これをログに記録します:

[0]: T: 01202 870738

01202 870738私は実際、最初のコードが2番目の一致としてログに記録される理由さえ理解していません。/T: (.*)/が含まれていない場合、どのように一致しT:ますか?

4

2 に答える 2

3

2つ目はグローバル正規表現であるため、返される配列は、文字列内の式に一致するすべてのリストです。最初のものはそうではないので、から取得するようなグループのリストですexec。(グループ0は一致全体であり、グループ1は唯一の括弧で囲まれた...グループです。)

于 2012-12-24T04:13:29.903 に答える
1

気が遠くなるのは、gフラグがある場合とない場合の正規表現から得られるさまざまな動作です。フラグが設定された正規表現を使用して呼び出すString.matchと、オブジェクトg内のパターンのすべてのインスタンスの配列が返されStringます。たとえば、次の式を使用します。

"Hello World!".match(/l/g);

この配列を返します:

["l", "l", "l"]

ただし、gフラグなしで同じ関数を呼び出すと、最初の要素が一致したパターンである配列が返されます。それ以降の要素は、括弧内の各式に一致します。たとえば、次の式を使用します。

"Hello World!".match(/(Hell)o World(!)/);

この配列を便利に返します:

["Hello World!", "Hell", "!"]

于 2012-12-24T04:40:31.007 に答える