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を使ったコードにしたら意図した通りの動きになった。
仕様?

JavaScriptでgフラグを使った正規表現で部分文字列を抜き出す
コメントはまだありません。
»
コメントはお気軽にどうぞ



