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

More than 5 years have passed since last update.

posted at

updated at

Ruby 正規表現のまとめ

正規表現オブジェクトの生成

  • 1. //でくくる ex) re1 = /Ruby/
  • 2. Regexp.new() ex) re2 = Regexp.new("Ruby")
  • 3. %r を使う ex) re3 = %r(/Ruby/) ★正規表現に/を含んだ文字列を指定したい場合便利

正規表現のマッチング

正規表現 =~ 文字列
マッチングした場合はマッチングした文字が何文字目かを、
マッチングしない場合はnilを返す。
ex)

  • 1. /Ruby/ =~ "aaRuby" #=> 2
  • 2. /Ruby/ =~ "Java" #=> nil

正規表現のパターン

  • ^ 行頭
  • $ 行末
  • [] または ex) /[AB]/ AまたはB
  • [^] 〜以外 ex) /[^AB]/ A,B以外
  • . 任意の1文字
  • \s 空白文字
  • \d 0-9までの数字
  • \w 英数字
  • \A 文字列の先頭
  • \z 文字列の末尾
  • \メタ文字 メタ文字自体(エスケープ) ex/^ABC/ =~ "^ABC"
  • * 0回以上の繰り返し (のうち最長)
  • + 1回以上の繰り返し (のうち最長)
  • *? 0回以上の繰り返しのうち最短
  • +? 1回以上の繰り返しのうち最短
  • ? 0または1回の繰り返し
  • {n} n回の繰り返し
  • {n,m} n-m回の繰り返し
  • | どれかに当てはまる ex) /^(ABC|DEF)$/ =~ "DEF"

Regexp.guote() , Regexp.escape()メソッドによるエスケープ

ex)

re1 = Regexp.new("abc*def")
re2 = Regexp.new(Regexp.quote("abc*def"))
re3 = Regexp.new(Regexp.escape("abc*def"))
p re1 =~ "abc*def" #=> nil
p re2 =~ "abc*def" #=> 0
p re3 =~ "abc*def" #=> 0

正規表現のオプション

オプション文字 オプション定数 意味
i Regexp::IGNOREGASE 大文字小文字区別しない
x Regexp::EXTENDED パターン内の空白と#以下(=コメント)を無視
m Regexp::MULTILINE .が改行コードにもマッチするようになる = 複数行マッチ
o なし 式展開は1度のみ行う(繰り返し処理内で正規表現を使う場合等)

キャプチャ

$数字 で正規表現内の()で囲まれた部分を取り出せる

ex)

/(.)(.)(.)/ =~ "ABC"
p $1 #=> "A"
p $2 #=> "B"
p $3 #=> "C"

(?:)でまとめられた部分はキャプチャ対象外

ex)

/(.)(?:\d\d)+(.)/ =~ "123456"
p $1 #=> "1"
p $2 #=> "6"

$` , $& , &'

  • $` マッチした部分より前の文字列
  • $& マッチした部分
  • &' マッチした部分より後ろの文字列 ex)
/C./ =~ "ABCDE"
p $` #=> "AB"
p $& #=> "CD"
p $` #=> "E"

正規表現を使うメソッド

scan メソッド

scan(正規表現) ・・・ マッチした部分を取り出す
ex)

str = "abracatabra"
#1. ブロックなし ・・ 配列で戻って来る
p str.scan(/.a/)  #=>=> ["ra", "ca", "ta", "ra"]

#2. ブロックを使用した例 ・・ マッチした文字列が個別に返ってくる
str.scan(/.a/) do |matched|
 p matched
end

#=>
"ra"
"ca"
"ta"
"ra"

#3. ブロックを使用、正規表現内で()が使われている場合 ・・ 配列で戻って来る
str.scan(/(.)(a)/) do |matched|
 p matched
end
#=>
["r", "a"]
["c", "a"]
["t", "a"]
["r", "a"]

subメソッドとgsubメソッド

  • sub(正規表現 , 置き替えたい文字列) ・・・ 正規表現にマッチした部分を置き替えたい文字列で置き換える 最初にマッチした部分だけを置き換える
  • gsub(正規表現 , 置き替えたい文字列) ・・・ subメソッド同様だが、マッチする部分を全て置き換える

ex)

str = "abc_def__g__hi"
p str.sub(/_+/, ' ') #=> "abc def__g___hi"
p str.gsub(/_+/, ' ') #=> "abc def g hi"

ex) ブロックを取る場合の例

str = "abracatabra"
nstr = str.gsub(/.a/) do |matched|
  '<' + matched.upcase+'>'
end
p nstr #=> "ab<RA><CA><TA>b<RA>"
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
71
Help us understand the problem. What are the problem?