Rubyの正規表現の特殊変数


正規表現

Rubyでは正規表現を生成する方法が大体二つある、即ち正規表現リテラルとRegexpクラスのクラスメソッドとなります。

正規表現を生成する

irb(main):001:0> a = /abcdefg/i
=> /abcdefg/i
irb(main):002:0> a.class
=> Regexp
irb(main):003:0> a = Regexp.new("abcdefg")
=> /abcdefg/
irb(main):004:0> a = Regexp.new("abcdefg", Regexp::IGNORECASE)
=> /abcdefg/i

Regexpのオプション

Regexp::IGNORECASE

大文字小文字の違いを無視する

irb(main):021:0> str = "This is Regexp"
=> "This is Regexp"
irb(main):022:0> t1 = Regexp.new("this is regexp", Regexp::IGNORECASE)
=> /this is regexp/i
irb(main):023:0> t1.match(str)
=> #<MatchData "This is Regexp">
irb(main):024:0> t2 = /this is regexp/i
=> /this is regexp/i
irb(main):025:0> t1.match(str)
=> #<MatchData "This is Regexp">

Regexp::MULTILINE

正規表現 「.」 が改行にマッチするようになります。

irb(main):028:0> str = "This is\nRegexp"
=> "This is\nRegexp"
irb(main):029:0> t2 = Regexp.new("This.*?Re", Regexp::MULTILINE)
=> /This.*?Re/m
irb(main):030:0> t2.match(str)
=> #<MatchData "This is\nRe">
irb(main):031:0> t2.match(str)[0]
=> "This is\nRe"

Regexp::EXTENDED

バックスラッシュでエスケープされていない空白と # から改行までを無視します。

irb(main):051:0> str = "this is regexp"
=> "this is regexp"
irb(main):052:0> t3 = Regexp.compile('
this         # cannot be used
\ is
\ regexp     # cannot be used
', Regexp::EXTENDED)
=> /
this         # cannot be used
\ is
\ regexp     # cannot be used
/x
irb(main):057:0> t3.match(str)
=> #<MatchData "this is regexp">

オプションの論理和

複数のオプションが論理和で使用可能となります。

irb(main):064:0> t4 = Regexp.compile('
this         # cannot be used
\ is
\ regexp     # cannot be used
', Regexp::IGNORECASE | Regexp::EXTENDED)
=> /
this         # cannot be used
\ is
\ regexp     # cannot be used
/ix
irb(main):069:0> str = "This is Regexp"
=> "This is Regexp"
irb(main):070:0> t4.match(str)
=> #<MatchData "This is Regexp">

特殊変数

特殊変数とは、パターンマッチした際に、マッチの情報をセットするローカルな変数となります。

[$~] 最後にマッチしたときの情報(MatchData オブジェクト)

Regexp.last_matchと同じ。

irb(main):001:0> /(abc)d(efg)/ =~ "abcdefghljklmnop"
=> 0
irb(main):002:0> Regexp.last_match
=> #<MatchData "abcdefg" 1:"abc" 2:"efg">
irb(main):003:0> $~
=> #<MatchData "abcdefg" 1:"abc" 2:"efg">

[$&] マッチしたテキスト全体

irb(main):004:0> $&
=> "abcdefg"

[$`] マッチしたテキストの手前の文字列

irb(main):006:0> /(bc)d(efg)/ =~ "abcdefghljklmnop"
=> 1
irb(main):007:0> $`
=> "a"

[$'] マッチしたテキストの後ろの文字列

irb(main):006:0> /(bc)d(efg)/ =~ "abcdefghljklmnop"
=> 1
irb(main):008:0> $'
=> "hljklmnop"

[$0], ファイル名

irb(main):009:0> /(bc)d(efg)/ =~ "abcdefghljklmnop"
=> 1
irb(main):012:0> $0
=> "irb"

[$1], [$2], ... キャプチャ文字列

irb(main):009:0> /(bc)d(efg)/ =~ "abcdefghljklmnop"
=> 1
irb(main):010:0> $1
=> "bc"
irb(main):011:0> $2
=> "efg"

[$+] 最後(末尾)のキャプチャ文字列

irb(main):013:0> /(bc)d(efg)/ =~ "abcdefghljklmnop"
=> 1
irb(main):014:0> $+
=> "efg"