JavaScriptでgフラグを使った正規表現で部分文字列を抜き出す

JavaScriptの正規表現でつまづいたときのメモ。

gフラグに関しては
Core JavaScript 1.5 Reference:Global Objects:RegExp – MDC
に書いてある。

var match = str.match(new RegExp(reg, "gi"));

でてっきりmatchには多重配列が代入されるのかと思っていたがどうやら違うらしい。
ちなみにregを変数にしているのは正規表現がダイナミックに変化するケースを扱っていたため。RegExp.$nもダイナミックにnを変えて呼び出せないので使わない。

検証コード。Firefox2、IE6、Opera9.5で試して同じ結果。

<script type="text/javascript">
var reg = "t(\\w+)";
var str = 'No, try not. Do, or do not. There is no try.';
var match = str.match(new RegExp(reg, "gi"));
print(match);
document.write("<hr />");
var match = str.match(new RegExp(reg, "i"));
print(match);
document.write("<hr />");
var regObj = new RegExp(reg, "gi");
do {
    var match = regObj.exec(str);
    print(match);
} while (regObj.lastIndex != 0);
function print(obj) {
    if (!obj) {
        return;
    }
    for (var i = 0; i < obj.length; i++) {
        document.write(i + ": " + obj[i] + "<br />");
    }
}
</script>

出力例:
0: try
1: There
2: try
—-
0: try
1: ry
—-
0: try
1: ry
0: There
1: here
0: try
1: ry

matchには正規表現中の()で括った部分文字列の配列が入っている、つもりなのだがString.matchを使ってgフラグを立てると部分文字列が取得できなくなってしまう。gフラグがなければ意図通り。

PHPのpreg_match_allで言うところの

preg_match_all('@t(\w+)@', $str, $match);

で$match[0]しかない、$match[1]がない、状態になる。

長々と苦悶した末に
JavaScript 第5版 – 11章 正規表現パターンマッチング – (DxD)∞
このページにヒントがあって3番目のexecを使ったコードにしたら意図した通りの動きになった。

仕様?

This entry was posted in いじる and tagged . Bookmark the permalink. Both comments and trackbacks are currently closed.

Page optimized by WP Minify WordPress Plugin