正規表現オブジェクトの生成
-
- //でくくる ex) re1 = /Ruby/
-
- Regexp.new() ex) re2 = Regexp.new("Ruby")
-
- %r を使う ex) re3 = %r(/Ruby/) ★正規表現に/を含んだ文字列を指定したい場合便利
正規表現のマッチング
正規表現 =~ 文字列
マッチングした場合はマッチングした文字が何文字目かを、
マッチングしない場合はnilを返す。
ex)
-
- /Ruby/ =~ "aaRuby" #=> 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>"