LoginSignup
4
4

More than 5 years have passed since last update.

Regexp.newでオプション(修飾子)を指定する

Last updated at Posted at 2014-02-21

/abc/i みたいなオブジェクトをRegexp.newでやるにはどうするか調べたのでメモ
実装を見ずに調べたので、ちょっと意外な結果だった

参考サイト
- http://www.rubylife.jp/regexp/ini/index3.html

指定できるオプション

オプション 効果
/i 大文字と小文字を区別せずにマッチを行う
/x パターンの中の空白やコメントを無視する
/m 複数行モード。メタ文字(.)が改行にもマッチする

定数を使って指定

pry(main)> Regexp.new("abc", Regexp::IGNORECASE)
=> /abc/i
pry(main)> Regexp.new("abc", Regexp::MULTILINE)
=> /abc/m
pry(main)> Regexp.new("abc", Regexp::EXTENDED)
=> /abc/x

定数の中身はただのFixnum

pry(main)> Regexp::IGNORECASE
=> 1
pry(main)> Regexp::IGNORECASE.class
=> Fixnum

なので、こんな書き方もできる

pry(main)> Regexp.new("abc", 1)
=> /abc/i
pry(main)> Regexp.new("abc", 2)
=> /abc/x
pry(main)> Regexp.new("abc", 4)
=> /abc/m

複数オプションを指定する場合
真面目に書くならビット演算で

pry(main)> Regexp.new("abc", Regexp::IGNORECASE | Regexp::MULTILINE)
=> /abc/mi

各定数は立つビットが別々なのでこれでもいける

pry(main)> Regexp.new("abc", 3)
=> /abc/ix
pry(main)> Regexp.new("abc", 5)
=> /abc/mi
pry(main)> Regexp.new("abc", 6)
=> /abc/mx
pry(main)> Regexp.new("abc", 7)
=> /abc/mix

ここから余談

何気に上記以外の引数でもいける。nilでない場合はiオプションがつくもよう
詳しく調べる気はなかったのでほんとに余談

pry(main)> Regexp.new("abc", nil)
=> /abc/
pry(main)> Regexp.new("abc", {})
=> /abc/i
pry(main)> Regexp.new("abc", [1,2,3])
=> /abc/i
pry(main)> Regexp.new("abc", :a)
=> /abc/i
pry(main)> Regexp.new("abc", "m")
=> /abc/i
4
4
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
4
4