"aaa".match(/regexp/) == ?
JavaScriptで正規表現マッチをする関数は Stringオブジェクトの match(regexp) な訳ですが、これの戻り値は (null or マッチした文字列)かと思ってた*1ら違うみたいですね。昨日のグリモン作るときに使って気づきました。
gオプションの有無やブラウザによっても微妙に違うみたいなので、メモ代わりにまとめてみます。
gオプションなしの場合
var m = "aabbcc".match(/a(b+|(c+))/);
プロパティ | 内容 | 値 | IE6.0 | Firefox2.0 | Opera9.0.2 |
---|---|---|---|---|---|
m.input | 入力した文字列 | "aaabbbaabb" | ○ | ○ | ○ |
m.index | マッチした箇所のインデックス | 1 | ○ | ○ | ○ |
m.lastIndex | マッチした箇所の末尾のインデックス | 4 | ○ | undefined | undefined |
m.length | 正規表現のグループ個数 + 1 | 3 | ○ | ○ | ○ |
m[0] | マッチした文字列全体 | "abb" | ○ | ○ | ○ |
m[1] | マッチの前方参照(RegExp.$1と同じ) | "bb" | ○ | ○ | ○ |
m[2] | マッチの前方参照(RegExp.$2と同じ) | "" | ○ | ○ | undefined |
lastIndexがFirefoxとOperaにありませんし、ORパターン('|')で評価されなかったほうが空文字列かundefinedかで違うのは微妙ですね。
前方参照グループが[n]で参照できるのは覚えておくといいかも。
gオプションありの場合
var m = "aabbaacc".match(/a(b+|(c+))/g);
プロパティ | 内容 | 値 | IE6.0 | Firefox2.0 | Opera9.0.2 | |
---|---|---|---|---|---|---|
m.input | 入力した文字列 | "aaabbbaabb" | ○ | undefined | undefined | |
m.index | マッチした箇所のインデックス | 5 | ○ | undefined | undefined | |
m.lastIndex | マッチした箇所の末尾のインデックス | 8 | ○ | undefined | undefined | |
m.length | 正規表現がマッチした回数 | 2 | ○ | ○ | ○ | |
m[0] | 1回目にマッチした文字列全体 | "abb" | ○ | ○ | ○ | |
m[1] | 2回目にマッチした文字列全体 | "acc" | ○ | ○ | ○ |
IE以外では、単純に繰り返しマッチで、マッチした箇所を格納した配列になっています。IEは最後にマッチしたときのinput, index, lastIndexが参照できます。
gオプションがどっちでもオブジェクトの型は Array です。なので、indexOf とか、 sort とか呼び出せます。sortは意味無いと思いますけど。
*1:僕のJavaScriptの知識ベースはとほほのJavaScriptリファレンスなわけで、正規表現(RegExp)をそのまま信じていたわけです。