URIのパターンマッチとURIクラス

URIのパターンマッチに定番のやり方はないの?って疑問を見つけて、
定番かどうかわからないけど、そーいえばRubyのライブラリに便利よさげなのが
あったような……って探したら、ありました。

さらにるびまにも解説がありました。

URI.parseメソッドで文字列を解析して、パターンにマッチしてなければ
URI::InvalidURIErrorが投げてくるのでrescueするとして
あとはschemeを指定するとか?
#もっとスマートなやり方ありそう。

require 'uri'

def http?(str)
  begin
    uri = URI.parse(str)
  rescue URI::InvalidURIError
    return false
  end
  return uri.scheme == 'http'
end

uri_list = [
  'http://d.hatena.ne.jp/Kanta',
  'https://d.hatena.ne.jp/Kanta',
  'http://d.hatena+ne.jp/Kanta',
  'file://d.hatena.ne.jp/kanta']

uri_list.each do |uri|
  print uri, " => ", http?(uri), "\n"
end

結果

http://d.hatena.ne.jp/Kanta => true
https://d.hatena.ne.jp/Kanta => false
http://d.hatena+ne.jp/Kanta => false
file://d.hatena.ne.jp/kanta => false

2006.11.15 追記

secondlifeさんにかっちょよい書き方を教えていただきました。

def valid_http_uri?(str)
  URI.split(str).first == 'http' rescue false
end

おお、Rubyっぽい。