オープンソースカンファレンス 2008 Kansai 内のセッション、Shibuya.js in Kyoto に発表者として参加させていただいたので、資料を公開します。
内容は JavaScript での正規表現の基本的な扱い方です。正規表現パターンの解説はよく見かけるのですが、それを実際にどう使うかという情報が不足していると感じたので、一部だけですが取り上げてみました。こちらの練習不足でぎこちないプレゼントなってしまい申し訳なかったです。
補足ですが、if ((match = re.exec(str)))
、while ((match = re.exec(str)))
のように条件式を丸括弧でくくっているのは、それが代入式であることを強調するためです。SpiderMonkey では if (match = re.exec(str))
などと書くと、「等値比較 (==) を代入 (=) と書き間違えていませんか?」というような警告が出ます。
また、「グローバルマッチの使用例」に関して、ECMAScript 3 では同一の正規表現リテラルを評価すると、常に同じ RegExp オブジェクトのインスタンスが返ることになっています。たとえば、以下のコードで regexps[0]
と regexps[1]
は同じオブジェクトを指します。Firefox と Opera はこれに従っています。
var regexps = [];
for (var i = 0; i < 2; i++)
regexps.push(/.../g);
regexps[0] == regexps[1];
// Firefox, Opera => true
// IE, Safari => false
しかし、ECMAScript 3.1/ECMAScript 4 では、正規表現リテラルを評価するたびに新しい RegExp オブジェクトのインスタンスを返すことになる予定です。この場合、while 文の条件式内で直に正規表現リテラルを書くと、ループの各回ごとに lastIndex プロパティの値が 0 で初期化された新たな RegExp オブジェクトが返るため、常に同じ位置から検索を開始することになり無限ループが発生してしまいます。これは IE、Safari の動作と同じです。
OSC Kansai ×2008 来年も来てくださいね!
セコメントをする