組み込みクラス: 正規表現編
正規表現オブジェクトをつくる
コンストラクタで生成する場合、オプションを引数の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?
メソッドでチェックできる。