プロが教えるわが家の防犯対策術!

初めて投稿します。

var re = new RegExp("A", "g");
var res = "ABABAB".match(re);
document.writeln(res);

上記のように、文字列に対してString.match()メソッドを使用して正規表現(gフラグつき)とマッチングを行うと結果は
「A,A,A」
とマッチしたAが全て配列として帰ってきますが、

var re = new RegExp("A", "g");
var res = re.exec("ABABAB");
document.writeln(res);

上記のように、文字列に対してregExp.exec()メソッドを使用して正規表現(gフラグつき)とマッチングを行うと結果は
「A」
とマッチしたAが1つしか帰ってきません。

ECMA 262 3rd Editionの仕様では、
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …

RegExp.exec()メソッドも、String.match()メソッドと同様に、regExpのオブジェクトを生成時に"g"フラグを付加して、ある文字列とマッチングすると、マッチするものが1件以上存在する場合、新しい配列にマッチしたもの全てを各要素に格納して値を返す動作を行うと(多分?)書かれているみたいなのですが、RegExp.exec()メソッドは、どのブラウザで操作を実行しようとしても、マッチした文字が1件しか帰ってきません。。。
教えていただきたいのは、
『何故、RegExp.exec()メソッドはマッチした文字が1件しか帰ってこないか?』です。

いろんなサイトを調べてみたのですが、どうしてRegExp.exec()メソッドがこのようなふるまいを起こすか断定できませんでした。。。

どなたか、JavaScriptやECMAScriptのロジカル的な部分で詳しい方がいらっしゃいましたら、
よろしくお願いいたします。m(__)m

A 回答 (1件)

> どなたか、JavaScriptやECMAScriptのロジカル的


> な部分で詳しい方がいらっしゃいましたら、
全然詳しくないですが、

下記MSDN(JScript.NET言語リファレンス)の説明がわかりやすいです。
execメソッドの説明:
http://www.microsoft.com/japan/msdn/library/defa …
matchメソッドの説明:
http://www.microsoft.com/japan/msdn/library/defa …

また、質問の中で紹介されたサイトの
・15.5.4.10 String.prototype.match (regexp)
・15.10.6.2 RegExp.prototype.exec (string)
をよ~く読めば、どうやら、
上記MSDNの説明と一致する、
つまり、『仕様通りの動作をしている』みたいです...
こういう仕様書に慣れてないと理解しづらいですよね。


↓のスクリプトで、オプションを変えて
動作を確認してみてください。

var s;
var str = "cdbBdbsbdbdz";

// dbBd,dbd
var re = new RegExp("d(b+)(d)","ig"); //<=>"i"
var arr = str.match(re);
document.write(arr + "<BR><BR>");

var re = new RegExp("d(b+)(d)","ig"); //<=>"i"
// dbBd,bB,d
var arr = re.exec(str);
s = arr.index + "-" + arr.lastIndex + ":" + arr + "<BR>";
s += RegExp.$1 + "," + RegExp.$2 + ";" + RegExp.$3 + "<BR>";
document.write(s + "<BR>");

// "ig":dbd,b,d / "i":dbBd,bB,d
arr = re.exec(str);
s = arr.index + "-" + arr.lastIndex + ":" + arr + "<BR>";
s += RegExp.$1 + "," + RegExp.$2 + ";" + RegExp.$3 + "<BR>";
document.write(s + "<BR>");

// "ig":null / "i":dbBd,bB,d
arr = re.exec(str);
document.write(arr);
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。
連絡が遅くなって申し訳ありません。。。

上記のスクリプトで動作確認いたしました。
String.match()メソッドでは配列の中にマッチングした全ての文字列を格納して返すけど、
Reg.exec()メソッドでは配列を返さないで、マッチングした文字列1件分だけが返ることが分かりました。

また、Reg.exec()メソッドで、マッチングした文字列を全て取り出したい場合は、Reg.lastIndexプロパティを使って繰り返しReg.exec()メソッドを実行すればいいわけですね!

確かに、この手の仕様書を読みなれていませんでした。。。
とにかく、解決いたしました。
ありがとうございました!

お礼日時:2003/10/16 13:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!