初めて投稿します。
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
No.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);
ご回答、ありがとうございます。
連絡が遅くなって申し訳ありません。。。
上記のスクリプトで動作確認いたしました。
String.match()メソッドでは配列の中にマッチングした全ての文字列を格納して返すけど、
Reg.exec()メソッドでは配列を返さないで、マッチングした文字列1件分だけが返ることが分かりました。
また、Reg.exec()メソッドで、マッチングした文字列を全て取り出したい場合は、Reg.lastIndexプロパティを使って繰り返しReg.exec()メソッドを実行すればいいわけですね!
確かに、この手の仕様書を読みなれていませんでした。。。
とにかく、解決いたしました。
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
Labelコントロールに数字を代入...
-
JSPで<SELECT>の中にDBから持っ...
-
コマンドプロンプト実行後に画...
-
Excel VBA シェイプの原型のサ...
-
エクセルVBAにおけるON TIMEメ...
-
(String args[])というメッソ...
-
Java 可変長引数と優先度
-
VBScriptからストアドプロシー...
-
ウィンドウを最前面にできません
-
onClickで関数呼出し後に、結果...
-
VBA コピーが出来ません…!
-
Application.Wait の参照設定
-
VBAでSaveAs使用し、指定してい...
-
VB.netで、シリアル通信のタイ...
-
DataGridViewの再描画。
-
Strutsで「setterメソッドが見...
-
クエリ文字列の"?"の後を非表示...
-
IDispatch と dispinterface の...
-
C#で、優先順位をつけてメソッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
DataGridViewでセルクリックイ...
-
final修飾子を使っているのに、...
-
javascriptからjavaを呼び出したい
-
Labelコントロールに数字を代入...
-
VBPをダブルクリックするとたま...
-
vbaエクセルマクロ RemoveDupli...
-
【sendkeysメソッドが動かずに...
-
mainメソッドのthrows節で設定...
-
エクセルVBAにおけるON TIMEメ...
-
Refreshメソッドの使い方
-
onClickで関数呼出し後に、結果...
-
ウィンドウを最前面にできません
-
JSPで<SELECT>の中にDBから持っ...
-
コマンドプロンプト実行後に画...
-
Application.Wait の参照設定
-
Excel VBA でExcelを終了したい...
-
配列のメソッド
-
エクセルのマクロでプリンタを...
-
Excel VBA シェイプの原型のサ...
おすすめ情報