組み込みクラス: 正規表現編

正規表現オブジェクトをつくる

コンストラクタで生成する場合、オプションを引数の2つ目に書くが、オプションを正式な書き方で書く必要があり、かなり面倒。

irb(main):007:0> r = /Hello/i
=> /Hello/i
irb(main):008:0> r.class
=> Regexp
irb(main):010:0> r = Regexp.new("Hello",Regexp::IGNORECASE | Regexp::MULTILINE)
=> /Hello/mi

マッチングを行う

match

マッチングする際は、正規表現オブジェクトの引数にマッチさせたい文字を渡す、という方法を行う。マッチすると「MatchData Object」が返ってくる。なかに、どの文字にマッチしたかが入っている。

irb(main):014:0> r.match("helloworld")
=> #<MatchData "hello">

=~

マッチする位置のインデックスを求める。matchと同じく正規表現オブジェクトの引数に渡すような書き方をしている。 一方Stringクラスでもこのメソッドは存在し、Stringクラスの引数に正規表現オブジェクトを入れるような書き方でも、同様の結果が得られる。

最初のマッチで処理を終了する。

irb(main):015:0> r =~ "***HellohelloHELLOworld!"
=> 3
irb(main):016:0> "***HellohelloHELLOworld!" =~ r
=> 3

===

trueかfalseかだけの取得でよいのなら、===が使える。

irb(main):018:0> r === "***HellohelloHELLOworld!"
=> true

escape

ピリオドやコンマなどをマッチさせたい場合はエスケープを行う必要がある。スラッシュでも可能だが、面倒なのでこのメソッドが用意されている。

(ちょっと使い方がよくわかっていない...)

マッチ結果を取得する。

正規表現のマッチ結果はインスタンス自身ではなく、Regexpクラス自身が保持しており、クラスメソッドのlast_matchで取得することが出来る。あるいは、特殊変数$~でも取得することが出来る。

irb(main):006:0> a = /Ba/i
=> /Ba/i
irb(main):007:0> a.class
=> Regexp
irb(main):008:0> "baseBallBear" =~ a
=> 0
irb(main):009:0> Regexp.last_match
=> #<MatchData "ba">
irb(main):010:0> p $~
#<MatchData "ba">
=> #<MatchData "ba">

マッチした部分文字列を取得するにはlast_matchメソッドに0の引数を渡してやればよい。

正規表現にカッコを指定した場合はその部分とのマッチも取得できる。 それにはlast_matchメソッドに1以降の引数を渡すか``$&$1$2```などの特殊変数を用いる。

irb(main):015:0> a = /Ba(se)/i
=> /Ba(se)/i
irb(main):016:0> "baseBallBear" =~ a
=> 0
irb(main):017:0> Regexp.last_match(0)
=> "base"
irb(main):018:0> Regexp.last_match(1)
=> "se"
irb(main):019:0> $&
=> "base"
irb(main):020:0> $1
=> "se"

正規表現論理和

二つの正規表現オブジェクトを用意して、「どちらかに当てはまるように」という、合成された正規表現オブジェクトを作ることができる。

irb(main):021:0> a = /abc/
=> /abc/
irb(main):022:0> b = /def/
=> /def/
irb(main):024:0> c = Regexp.union(a,b)
=> /(?-mix:abc)|(?-mix:def)/
irb(main):025:0> c =~ "afdsdcabclfdrf"
=> 6
irb(main):027:0> c =~ "afdsedefdcaclf"
=> 5
irb(main):028:0> Regexp.last_match
=> #<MatchData "def">

scanについて

文字列の中で正規表現に合致する部分をすべて取得したいというシチュエーションは多数あると考えられるが、実はそうしたメソッドはStringクラスのscanとして用意されている。

irb(main):034:0> band = "BaseballBEAR"
=> "BaseballBEAR"
irb(main):035:0> r = /ba/i
=> /ba/i
irb(main):036:0> band.scan(r)
=> ["Ba", "ba"]

正規表現オブジェクトの属性を取得する

正規表現には最大5個のオプションを課すことが出来る。

instance method Regexp#options (Ruby 2.6.0)

  • EXTENDED : バックスラッシュ記法でエスケープされていない空白を無視する。
  • IGNORECASE : 大文字小文字の差を無視
  • MULTILINE : .に改行がマッチする
  • FIXEDENCODING : 指定されたエンコーディングの文字にしかマッチしない
  • NOENCODING: エンコーディングの違いを無視する。

optionsメソッドはこれらの論理積を出す。IGNORECASEの有無だけチェックしたいのであれば.casefole?メソッドでチェックできる。