見出しに全部書いてしまったけど、一応備忘録として調べた内容を書いておく。
AutoPagerizeのSITEINFOを投稿すると、いつもdrryさんという方がURLの正規表現を添削してくれるんだけど(ありがとうございます)、普段あまり使わないパターンが登場して「何だっけこれ?」と思った。
^http://www\.carview\.co\.jp/(road_impression|green/report/road_imp|magazine/market_watch)/
^http://www\.carview\.co\.jp/(?:green/report/road_imp|magazine/market_watch|road_impression)/
サブパターンの括弧の先頭に、見慣れない「?:」というものが。何ぞこれ?
Mozilla Developer Centerの正規表現のページで(?:x)の振る舞いを参照してみると、
'x' にマッチするが、マッチしたものは記憶しない。これはキャプチャしない括弧と呼ぶ。マッチした部分文字列は先程のような配列の要素 [1], ..., [n] から参照することはできない。
とある。
つまり、戻り値で$1, $2といったサブパターンに相当する、括弧の中身にマッチした部分の結果は受け取れないと云う意味のようだ。
ということでFirebugを使って、実際の挙動を確認してみることにする。
AutoPagerizeでは、String.prototype.matchにマッチさせたいパターンを文字列を渡して暗黙的にRegExpオブジェクトに変換してから評価されるので、そこも同じ手順で確認する。
各アイテムのJSONリンクから、実際にAutoPagerizeに渡す形の、エスケープされた文字列が参照できるので、これを使う。
var url = "http://www.carview.co.jp/magazine/market_watch/2010/03/559/"; var pattern = "^http:\/\/www\\.carview\\.co\\.jp\/(road_impression|green\/report\/road_imp|magazine\/market_watch)\/"; console.dir(url.match(pattern));
添削前のパターンで試してみると、$1に相当する(実際は添字1の配列要素)サブパターン部分のマッチ結果が返されることが分かる。
var url = "http://www.carview.co.jp/magazine/market_watch/2010/03/559/"; var pattern = "^http:\/\/www\\.carview\\.co\\.jp\/(?:green\/report\/road_imp|magazine\/market_watch|road_impression)\/"; console.dir(url.match(pattern));
添削後のパターンで試してみると、括弧内のサブパターンはキャプチャされず返されないことが分かる。
最近のツッコミ
参号館 日記(ariyasacca)