104
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

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

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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
104
Help us understand the problem. What are the problem?