やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

組込ライブラリ(Regexp)

 正規表現

成果物

情報源

Regexp

正規表現のクラス。正規表現リテラルはスラッシュで囲んだ形式で記述します。

/^this is regexp/

Regexp.new(string) を使って正規表現オブジェクトを動的に生成することもできます。

str = "this is regexp"
rp1 = Regexp.new("^this is regexp")
p rp1 =~ str           # => 0
p Regexp.last_match[0] # => "this is regexp"

Ruby 3.0.0 から正規表現リテラルは freeze されるようになりました。

p /abc/.frozen?
# => true
p /a#{42}bc/.frozen?
# => true
p Regexp.new('abc').frozen?
# => false

正規表現リテラル/正規表現リテラル も参照してください。

メンバ抜粋

特異メソッド

compile escape last_match new quote try_convert union

インスタンスメソッド

== === =~ ~ casefold? encoding eql? fixed_encoding? hash inspect match match? named_captures names options source to_s

定数

EXTENDED FIXEDENCODING IGNORECASE MULTILINE NOENCODING

//, new, compile

new(string, option = nil, code = nil) -> Regexp
compile(string, option = nil, code = nil) -> Regexp
引数 概要
string 正規表現を文字列として与える
option Regexp::IGNORECASE, Regexp::MULTILINE, Regexp::EXTENDED論理和。Integer以外なら真偽値とし真ならRegexp::IGNORECASEになる
code nNが与えられたとき正規表現エンコーディングASCII-8BITになる
概要 定数 リテラル時オプション
大文字小文字を無視する Regexp::IGNORECASE /正規表現パターン/i
メタ文字.が改行にマッチする Regexp::MULTILINE /正規表現パターン/m
フリーフォーマットモードになり空白を無視する。コメントの仕様が変化する Regexp::EXTENDED /正規表現パターン/x
#{}の展開を1回しかしない /正規表現パターン/o

オブジェクト生成

a = [
  /^[a-zA-Z_][0-9a-zA-Z_]*$/,
  Regexp.new('^[a-zA-Z_][0-9a-zA-Z_]*$'),
  Regexp.compile('^[a-zA-Z_][0-9a-zA-Z_]*$'),
]
a.each {|r|
  p r
  p r.class
  p r.match?('abc') # true
  p r.match?('0ab') # false
}

大文字小文字を無視する

a = [
  /^[a-z]+$/i,
  Regexp.new('^[a-z]+$', Regexp::IGNORECASE),
  Regexp.compile('^[a-z]+$', Regexp::IGNORECASE),
]
a.each {|r| p r.match?('Abc') } # true

改行マッチ

a = [
  /^[a-z]+$/m,
  Regexp.new('^[a-z]+$', Regexp::MULTILINE),
  Regexp.compile('^[a-z]+$', Regexp::MULTILINE),
]
a.each {|r| p r.match?("abc\ndef") } # true

フリーフォーマットモード

r = /^  # コメントは除外
[a-z]+  # コメントは除外
$/x     # コメントは除外
p r.match?('abc') # true
r = Regexp.new('^  # コメントは除外
[a-z]+             # コメントは除外
$',                # コメントは除外
Regexp::EXTENDED)
p r.match?('abc')  # true

 フリーフォーマットモードのとき半角スペースはバックスラッシュ\エスケープする。

r = /^            # コメントは除外
this\ is\ regexp  # コメントは除外
$/x               # コメントは除外
p r.match?('this is regexp') # true
r = Regexp.new('^  # コメントは除外
this\ is\ regexp   # コメントは除外
$',                # コメントは除外
Regexp::EXTENDED)
p r.match?('this is regexp') # true

大文字小文字を無視する+フリーフォーマットモード

r = /^
this         # コメントは除外
\ is         # コメントは除外
\ regexp     # コメントは除外
$/xi
p r.match?('This is RegExp') # true
r = Regexp.compile('
this         # コメントは除外
\ is         # コメントは除外
\ regexp     # コメントは除外
', Regexp::EXTENDED | Regexp::IGNORECASE)
p r.match?('This is RegExp') # true

所感

 matchメソッドが返すMatchDataクラスも参照。

対象環境

$ uname -a
Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux