CSSの詳細度みたいな計算をRegexでやってみたりできないか

wedataのSITEINFOの優先順位 - AutoPagerize | Google グループのはなし。

あっちにはちょっとあとでかきます。

CSS解説 -カスケード (The cascade)-のように、url正規表現の詳細度を計算して適用順序を自動できめられないか。

var t = json.map( function (u) {
  var m;
  u.replace( /^https?:\/\// );
  if ( m = u.match( /((([\w\-]+\.)+)\w{2,4})(?=(\/|\b))/ ) ) {
    var t = {u: u, d: m[1]};
    return t;
  }
} );
t

var stat = t.reduce( function (s, i) {
  if ( i ) {
    ( s[i.d] ? (s[i.d].push(i.u)) : s[i.d] = [i.u] );
  }
  return s;
}, {} );
stat

var dupe = keys(stat).reduce( function (s, k) {
  if (stat[k].length > 1 ) {
    s[k] =  stat[k] ;
  }
  return s;
}, {} );
copy(uneval(dupe))

jsonhttp://wedata.net/databases/AutoPagerize/items.json?callback=callback からとったもの。
複数のアイテムが定義されているドメインのurlの正規表現を取り出す。複雑な定義(|がはいっていたりTDLが*なものとか)は入ってない。

下のjsonが上のコード動かした結果です。

みたかんじ、

  1. regexを解析して量指定子が表す最小のマッチに展開する
  2. 同一ドメインに定義されたほかのやつと比較して
  3. 他とマッチするやつは優先度を下げる

という処理をいれたら自動で解決できそうな気もします。

正規表現のパーサ作るのがかんたんなのかはよくわかんない。

({'www.veoh.com':["http://www.veoh.com/browse/(videos|channels).html.+", "^http://www.veoh.com/search.html"], 'f.hatena.ne.jp':["http://f.hatena.ne.jp/model/", "http://f.hatena.ne.jp/.+?/\\d+"], 'www.nikkeibp.co.jp':["http://www.nikkeibp.co.jp/style/biz/column/tahara/", "http://www.nikkeibp.co.jp/(style/biz|style/eco|lc)", "http://www.nikkeibp.co.jp/netmarketing", "http://www.nikkeibp.co.jp/style/secondstage", "http://www.nikkeibp.co.jp/sj/"], 'itpro.nikkeibp.co.jp':["http://itpro.nikkeibp.co.jp/article/COLUMN*", "http://itpro.nikkeibp.co.jp/article/Watcher/[\\d\\/]+", "http://itpro.nikkeibp.co.jp/article/NEWS/", "http://itpro.nikkeibp.co.jp/article/COLUMN/.*"], 'www.nicovideo.jp':["http://www.nicovideo.jp/ranking/.*", "http://www.nicovideo.jp/(recent|newarrival|tag/|search/)", "http://www.nicovideo.jp/(recent|newarrival|tag/|search/)"], 'slashdot.jp':["http://slashdot.jp/(journal.pl|.+journal)", "http://slashdot.jp/"], 'b.hatena.ne.jp':["http://b.hatena.ne.jp/(\\w+list\\?|video)", "http://b.hatena.ne.jp/(t/*|keyword/*)", "http://b.hatena.ne.jp/"], 'i.hatena.ne.jp':["http://i.hatena.ne.jp/", "http://i.hatena.ne.jp/idealist"], 'vox.com':["http://(.*).vox.com/library/posts/tags/.*/", "http://[\\w-]+.vox.com/explore/neighborhood/.*"], 'userscripts.org':["http://userscripts.org/scripts/search", "http://userscripts.org/scripts/show/", "http://userscripts.org/*"], 'nowa.jp':["http://nowa.jp/recent/*", "http://.+.nowa.jp/*"], 'mixi.jp':["http://mixi.jp/list_friend.pl*", "http://mixi.jp/new_friend_diary.pl", "http://mixi.jp/show_log.pl", "http://mixi.jp/view_diary.pl", "http://mixi.jp/list_diary.pl", "http://mixi.jp/view_album.pl", "http://mixi.jp/new_bbs.pl", "http://mixi.jp/list_bbs.pl*"], 'mitter.jp':["http://mitter.jp/[^/]+/friends", "http://mitter.jp/[^/]+"], 'clip.livedoor.com':["http://clip.livedoor.com/hot/*", "http://clip.livedoor.com/clips/*", "http://clip.livedoor.com/*"], 'www.gumonji.net':["http://www.gumonji.net/cgi-bin/footprint.cgi", "http://www.gumonji.net/cgi-bin/bbs_list.cgi", "http://www.gumonji.net/cgi-bin/diary_list.cgi", "http://www.gumonji.net/cgi-bin/friend_list.cgi", "http://www.gumonji.net/cgi-bin/user_list.cgi", "http://www.gumonji.net/cgi-bin/message_box.cgi", "http://www.gumonji.net/cgi-bin/beam_list.cgi", "http://www.gumonji.net/cgi-bin/beam.cgi", "http://www.gumonji.net/cgi-bin/zone_list.cgi", "http://www.gumonji.net/cgi-bin/community_list.cgi", "http://www.gumonji.net/cgi-bin/bbs.cgi", "http://www.gumonji.net/cgi-bin/album_list.cgi", "http://www.gumonji.net/cgi-bin/idea_list.cgi"], 'www.google.com':["http://www.google.com/ig/directory", "http://www.google.com/history/"], 'www.facebook.com':["http://www.facebook.com/s.php", "http://www.facebook.com/album.php"], 'del.icio.us':["http://del.icio.us/search/", "http://del.icio.us/*"], 'community.livejournal.com':["http://community.livejournal.com/something2see/", "http://community.livejournal.com/vintagephoto/\\d{4}/\\d{2}/\\d{2}/"], 'builder.japan.zdnet.com':["http://builder.japan.zdnet.com/", "http://builder.japan.zdnet.com/"], 'japan.zdnet.com':["http://japan.zdnet.com/sp/feature/ziddy/*", "http://japan.zdnet.com/[\\w/]+/story/[\\d,]+.htm"], 'youtube.com':["http://(www.)?youtube.com/results", "http://(www.)?youtube.com/results", "http://.*.youtube.com/results"], 'auctions.yahoo.co.jp':["http://search.*.auctions.yahoo.co.jp/.*", "http://(list|search)\\d?.auctions.yahoo.co.jp/.*", "http://.*auctions.yahoo.co.jp/.*mode=1.*"], 'blogs.yahoo.co.jp':["http://blogs.yahoo.co.jp/[^/]*/MYBLOG/yblog.html", "http://blogs.yahoo.co.jp/(.+)/MYBLOG/yblog.html.+", "http://blogs.yahoo.co.jp/(.+)/GALLERY/.+"], 'twitter.com':["https?://twitter.com/*", "https?://twitter.com(.*)(/archive|/friends|/followers|/favorites)"], 'forums.mozillazine.org':["http://forums.mozillazine.org/viewtopic.php", "http://forums.mozillazine.org/viewforum.php*"], 'selenic.com':["http://selenic.com/repo/index.cgi/hg/shortlog/", "http://selenic.com/repo/index.cgi/hg/log/"], 'itmedia.co.jp':["http://(www|plusd).itmedia.co.jp/[^/]+/articles/", "http://(www|plusd).itmedia.co.jp/[^/]+/articles/0([0-5]|601)"], 'www.getchu.com':["http://www.getchu.com/php/search.phtml*", "http://www.getchu.com/php/calendar.phtml*"], 'friendfeed.com':["http://friendfeed.com/", "http://friendfeed.com/settings/subsc", "http://friendfeed.com/"], 'flickr.com':["http://.*flickr.com/photos/", "http://.*flickr.com/photos/.+/tags/", "http://.*flickr.com/photos/tags/", "http://.*flickr.com/photos/.+/sets/.+/detail/", "http://.*flickr.com/photos/.+/sets/", "http://.*flickr.com/search/", "http://.*flickr.com/groups/[^/]+/pool/", "http://.*flickr.com/photos/[^/]+/favorites/"], 'www.feecle.jp':["http://www.feecle.jp/blog/hitokoto.php.*", "http://www.feecle.jp/*"], 'deviantart.com':["http://.*.deviantart.com/(gallery|favourites|wishlist)/*", "http://(browse|search|prints).deviantart.com/*"], 'www.amazon.co.jp':["http://www.amazon.co.jp/.+/customer-reviews/", "http://www.amazon.co.jp/(s/|gp/search)", "http://www.amazon.co.jp/gp/yourstore/"], 'allabout.co.jp':["http://allabout.co.jp/finance/", "http://allabout.co.jp/*"]})