LoginSignup
108
104

More than 5 years have passed since last update.

Rubyの正規表現まわりで最近知ったことのメモ

Last updated at Posted at 2013-07-17

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
108
104
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
108
104