Rhino用だとこんなコードになるらしい。
// 角括弧[]の中身を取り出す(数字があった場合) var text = 'a[0]bc[1]de[]fg[2][3]hij[4]klmn['; var r = new RegExp(/\[(\d+)\]/g); var m; while( (m = r.exec(text) ) != null) { print('m[1] = ' + m[1] ); }
結果は、
m[1] = 0 m[1] = 1 m[1] = 2 m[1] = 3 m[1] = 4
globalマッチのときは '文字列'.match(/正規表現/g) をするとマッチした部分全体の文字列が入った配列が帰ります。 カッコ内の取り出しはできないっぽい?
var text = 'a[0]bc[1]de[]fg[2][3]hij[4]klmn['; var r = new RegExp(/\[(\d+)\]/g); var m = text.match(r); print(m); print('m instanceof Array = ' + (m instanceof Array) ); print('typeof(m[0] ) = ' + typeof(m[0] ) );
結果は、
[0],[1],[2],[3],[4] m instanceof Array = true typeof(m[0] ) = string
つまり、カッコ内を拾うときは /正規表現/g.exec('文字列') じゃないとダメで、マッチした部分全体が欲しいときは '文字列'.match(/正規表現/g) の方が楽。
何度も正規表現を使う場合、RegExpはコードに直書きせずに毎回newした方がいいようです。 コードに直書きするとRegExpがグローバル変数として作られ、前回のexecを引きずるためです。
参考サイトは、
自分で試したコードは、
var text = 'a[0]bc[1]de[]fg[2][3]hij[4]klmn['; var m; print('RegExp直書き'); function test0() { print('call test0()'); while( (m = /\[(\d+)\]/g.exec(text) ) != null) { print('m[1] = ' + m[1] ); if(2 < m[1]) { break; } } } test0(); test0(); test0(); print('---------------------'); print('RegExp毎回new'); function test1() { print('call test1()'); var r = new RegExp(/\[(\d+)\]/g); while( (m = r.exec(text) ) != null) { print('m[1] = ' + m[1] ); if(2 < m[1]) { break; } } } test1(); test1(); test1();
実行結果、
RegExp直書き call test0() m[1] = 0 m[1] = 1 m[1] = 2 m[1] = 3 call test0() m[1] = 4 call test0() --------------------- RegExp毎回new call test1() m[1] = 0 m[1] = 1 m[1] = 2 m[1] = 3 call test1() m[1] = 0 m[1] = 1 m[1] = 2 m[1] = 3 call test1() m[1] = 0 m[1] = 1 m[1] = 2 m[1] = 3
ちなみに、「JavaScriptの正規表現リテラルが状態を持つデモ」のブラウザごとの結果は少し古い情報です。 今のブラウザで試すと全部同じ結果(下の例)になりました。 標準化されたからですかね? 試したブラウザは、
- firefox 4.0
- google chrome 10.0
- Opera 11.01
- Internet Explorer 8.0