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

posted at

updated at

Organization

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"

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?