2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rubyの正規表現の特殊変数

Last updated at Posted at 2022-03-24

正規表現

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"
2
1
2

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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?