ariyasacca

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|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|06|07|08|09|10|

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. 雷悶 (2025年10月22日(水)20:46)「>週刊中年ジャンプ コメントありがとうございます! 老眼に負けずワンピ完結まで読むぞ!!」
  2. 週刊中年ジャンプ (2025年10月22日(水)19:54)「自分もはてブから来ました!雷悶さん、お世話になりました!今後ともよろしくお願いします!!!このインターネット感素晴ら..」
  3. 雷悶 (2025年10月22日(水)10:40)「>同時期にYJを通過した者です 「第二の創業」って宣言する社長さん世の中に沢山いるけど人事制度いじる程度だろな〜っ..」

参号館 の中の 日記(ariyasacca)

トップ «前の日記(2010年04月01日 (木)) 最新 次の日記(2010年04月06日 (火))» 編集
Generated by tDiary version 5.2.3
Powered by Ruby version 3.0.2-p107

AltStyle によって変換されたページ (->オリジナル) /