MDNまた、String#replaceの第二引数にfunctionを指定する形式でもループできる。{...})リテラルをそのまま使わないほうがいい理由は以下のとおり。Firefoxの正規表現リテラルは、状態を持っている。こわい)Firefox,Opera,Chromeも。IEやSafariは違うみたい。この記事を書くまで全然知らなかった。JavaScriptの正規表現リテラルが状態を持つデモ以下も参照。ブックマークコメントも。実用にはならなそうだけど、面白い。素人がプログラミングを勉強していたブログというわけで、以下のルールを守らなければならない。ループの中にgオプションが付いた正規表現リテラルを書かない。ループの中でg付きの正規表現をexecすると、無限ループになる可能性がある。ブラウザによっては毎回先頭にマッチして無限ループになる。これだとどうか?while内でbreak/returnして途中で終わると、リテラルにその状態が残る。次にここを実行すると途中からループが始まる。対象の文字列を引数で取っているfunctionだったりすると非常にマズイ。デモのtest3参照。RegExp()が安心。見た目通りに動いてくれる。{}同様にfunctionの中にg付き正規表現リテラルを書くと、呼び出し毎に実行結果が変わる可能性がある。String#matchで使う分には問題無い気がする。Firefoxだとm1の値が呼び出し毎に変わる。RegExp()の引数には正規表現リテラルを使う。RegExp(/\s+/g)の方がよい。コメントでjserさんに教えてもらった。EcmaScript仕様で、RegExpの第1引数に正規表現リテラルを取れることが書いてある。その場合、第2引数が指定されるとTypeErrorになる。http://interglacial.com/javascript_spec/a-15.html#a-15.10.4文字列を分割する。String#splitが使えるが、引数に正規表現を使ってはいけない。正規表現を指定した場合の挙動はブラウザごとに異なる。IE6IE6でsplitに正規表現を指定すると、分割した要素の中から空文字列の要素を消してしまう。http://aligach.net/diary/20060707.html正規表現を使いたい場合、クロスブラウザなsplitが以下に掲載されているのでこれを使う。http://blog.stevenlevithan.com/archives/cross-browser-splitsplitの挙動を詳細に調べているテストが以下にある。http://stevenlevithan.com/demo/split.cfmIE6,Firefox3,Safari3,Opera9,Chrome1,Chrome2で試した。