URI.regexp
URIの文字列にマッチする正規表現をサクッと取り出せる。
sample1.rb
require "uri"
"hoge http://udzura.jp fuga".scan URI.regexp
#=> [["http", nil, nil, "udzura.jp", nil, nil, nil, nil, nil]]
HTTPだけ、HTTP/HTTPSで、などの場合はそれぞれ URI.regexp("http")
, URI.regexp(["http", "https"])
とできる
これはURIライブラリが内部で使っている都合上スキーマやらホスト名やらが分解された形でマッチするので、ただURLっぽい文字列を取り出したい時は URI.extract
が使える。
sample2.rb
data = File.read("data.txt")
URI.extract(data, ["http", "https"]).each do |uri|
puts uri
end
Regexp.union
正規表現で、表現Xまたは表現Yに合致するものを求めたい場合に、各表現すべてにマッチする正規表現を生成してくれる。 |
で手動で繋げて再作成するより確実っぽい。
sample3.rb
re = Regexp.union(URI.regexp("http"), %r<(\[.+\]\(.+\))>)
"http://udzura.jp [hoge](fuga)".scan re
#=> [
["http", nil, nil, "udzura.jp", nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil, nil, "[hoge](fuga)"]
]
正規表現内部の &&
正規表現の文字クラス( [a-z]
だとか \w
)はご存知の方も多いだろうが、 &&
を利用すると文字クラスの共通部分を表現できる。
a ~ g 以外の単語構成文字を表す文字クラスは [\w&&[^a-g]]
のようになる。
sample4.rb
"a" =~ /[\w&&[^a-g]]/
#=> nil
"h" =~ /[\w&&[^a-g]]/
#=> 0