ariyasacca

カテゴリ一覧

Biz | SF | Software | tDiary | Web | ゲーム | サバティカル | スポーツ | ミステリ | メタル | 健康 | 投資 | 携帯 | 時事ネタ | 死生観 | 資格 | 雑記
2004|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|

2010-04-05 (月) [長年日記]

[雑記]正規表現の特殊文字(?:x)はマッチしたサブパターンを記憶しない

見出しに全部書いてしまったけど、一応備忘録として調べた内容を書いておく。

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を参照してみる

Mozilla Developer Centerの正規表現のページで(?:x)の振る舞いを参照してみると、

'x' にマッチするが、マッチしたものは記憶しない。これはキャプチャしない括弧と呼ぶ。マッチした部分文字列は先程のような配列の要素 [1], ..., [n] から参照することはできない。

とある。

つまり、戻り値で$1, $2といったサブパターンに相当する、括弧の中身にマッチした部分の結果は受け取れないと云う意味のようだ。

確認してみる

ということでFirebugを使って、実際の挙動を確認してみることにする。

AutoPagerizeでは、String.prototype.matchにマッチさせたいパターンを文字列を渡して暗黙的にRegExpオブジェクトに変換してから評価されるので、そこも同じ手順で確認する。

各アイテムのJSONリンクから、実際にAutoPagerizeに渡す形の、エスケープされた文字列が参照できるので、これを使う。

(?:x)なし

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の配列要素)サブパターン部分のマッチ結果が返されることが分かる。

【スクリーンショット】括弧内のサブパターンが返されている。

(?:x)あり

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));

添削後のパターンで試してみると、括弧内のサブパターンはキャプチャされず返されないことが分かる。

【スクリーンショット】括弧内のサブパターンが返されない。


最近のツッコミ

  1. 雷悶 (2023-06-24(土)22:25)「新大阪駅で降りると必ず視界に入るサムティ行くしかないのか~?」
  2. ブリネル (2023-06-24(土)20:58)「次はサムティアンド箕面ビールツアーしかないっしょ〜 DIE WITH ZERO〜」
  3. 雷悶 (2023-03-08(水)19:02)「10年後にはリゾマンを購入している筈っしょ~(言うだけ)」

参号館  の中の  日記(ariyasacca)

トップ «前の日記(2010-04-01 (木)) 最新 次の日記(2010-04-06 (火))» 編集