正規表現

正規表現覚書

rubyで確認してみたまとめ

Regexp

正規表現オブジェクト

# //で囲んで生成
pry(main)> /hoge/.class
=> Regexp

# Regexp.new()で生成
pry(main)> Regexp.new("hoge").class
=> Regexp

正規表現記法

正規表現 意味 説明
^ 行頭 /^hoge/ hogeで始まる
$ 行末 /hoge$/ hodeで終わる
. 改行を除く任意の1文字 /a.b/ aとbの間に1文字
[...] []内のいずれか1文字 [A-Za-z] 英字
[^...] []内に含まれない1文字 [0-9] 数字以外
* 直前の文字の0回以上の繰り返し /Go*gle/ Ggle、Gogle、Google、Gooogle、、、
+ 直前の文字の1回以上の繰り返し /Go*gle/ Gogle、Google、Gooogle、、、
? 直前の文字が0回or1回 /Go*gle/ Ggle、Gogle
{m} m回の繰り返し [0-9]{3} 000〜999の数字
a|b aまたはb /^(ABC|abc)$ ABCまたはabcの行
(...) グループ /(hoge)+/ hogeの1回以上の繰り返し
\w 英数字と_ /^\w+$/ 英数字のみの行
\W 英数字と_以外 /a\Wb/ aとbの間に英数字と_以外の文字
\s 空白文字 /^a\sb/ aとbの間に空白文字1文字
\S 空白文字以外 /a\Sb/ aとbの間に空白文字以外の文字
\d 数字 /a\d/ aと数字1文字
\D 数字以外 /a\D/ aと数字以外の1文字

scan

引数で指定した正規表現のパターンとマッチする部分を文字列からすべて取り出し、配列にして返す。

pry(main)> "123 abc Abc aBC ABc ABC".scan(/[A-Z][A-Za-z]+/)
=> ["Abc", "BC", "ABc", "ABC"]

https://ref.xaio.jp/ruby/classes/string/scan

match

matchメソッドはStringクラスとRegexpクラスの両方に定義されているため、文字列と正規表現オブジェクトを入れけても同じ動作になる。

pry(main)> "123-4567".match(/\d+-\d+/)
=> #<MatchData "123-4567">
pry(main)> /\d+-\d+/.match("123-4567")
=> #<MatchData "123-4567">

[], slice

文字列から正規表現にマッチした部分を抜き出す。

pry(main)> "郵便番号は123-4567です".slice(/\d{3}-\d{4}/)
=> "123-4567"
pry(main)> "郵便番号は123-4567です"[/\d{3}-\d{4}/]
=> "123-4567"

sliceメソッドは[]のエイリアスメソッド。

split

マッチした文字列を区切り文字にして文字列を分解、配列として返す

pry(main)> '123,456-789'.split(/,|-/)
=> ["123", "456", "789"]

gsub

第一引数の正規表現にマッチした文字列を、第二引数の文字列で置き換える。

pry(main)> '123,456-789'.gsub(/,|-/, ':')
=> "123:456:789"

キャプチャ

# マッチするとMatchDataが返却される
pry(main)> match_data = /(\d+)年(\d+)月(\d+)日/.match("今日は2018年06月10日です。")
=> #<MatchData "2018年06月10日" 1:"2018" 2:"06" 3:"10">

# 0番目の要素はマッチした文字列全体
pry(main)> match_data[0]
=> "2018年06月10日"

# 1番目〜の要素は()で囲んだ部分が順番に格納される
pry(main)> match_data[1]
=> "2018"
pry(main)> match_data[2]
=> "06"
pry(main)> match_data[3]
=> "10"
pry(main)> match_data[4]
=> nil

=~、!~によるマッチング判定

=~演算子、又は !~演算子を利用し戻り値から判定する。

マッチする マッチしない
=~演算子 マッチした位置のインデックス値 nil
!~演算子 false ※trueじゃないことに注意 true

実行例

# =~ の戻り値
pry(main)> "abc" =~ /b/
=> 1
pry(main)> "abc" =~ /d/
=> nil

# !~ の戻り値
pry(main)> "abc" !~ /b/
=> false
pry(main)> "abc" !~ /d/
=> true

参考

http://rubular.com/