【Ruby】正規表現を使った文字の置換

paizaで正規表現出てきたけど、忘れかけてる…
忘れないようにメモメモ。

文字の置換

sub

一致した最初の部分の文字列を置換したいときに使う。
書き方はこう。

str = "ヤサゴリ、おはよー"
str.sub(/おはよー/, "こんばんはー")
=> "ヤサゴリ、こんばんはー"

str = "ヤサゴリ、おはよーおはよー"
str.sub(/おはよー/, "こんばんはー")
=> "ヤサゴリ、こんばんはーおはよー"

最初の部分だけしか置換されないので、連続で同じ言葉が出てきても変換されない。

gsub

一致した全部の文字列を置換したいときはこっち。

str = "ヤサゴリ、おはよーおはよー"
str.gsub(/おはよー/, "こんばんはー")
=> "ヤサゴリ、こんばんはーこんばんはー"

2つあったおはよーが両方とも変換されている。

繰り返しの言葉

繰り返しで出てくる言葉を置換させたい場合、メタ文字を使うと便利。
メタ文字はこんなのがある。

メタ文字 意味
✳︎ 0回以上
+ 1回以上
? 0か1回
{n} n回
. 任意の文字

メタ文字を使って文字列を置換してみる。

str = "abc,aabbcc,aaabbbccc"
str.gsub(/a+/, "z")
=> "zbc,zbbcc,zbbbccc"

'+'は「1回以上」の繰り返しだから、連続した'a'は全部'z'に置換される。
さらにこんな書き方をすると

str = "asdfjuwirehrikosdfc"
str.gsub(/a.+c/, "z")
=> "z"

'.+'なので'a'から'c'の間にある任意の1回以上の文字はすべて含まれる。
そのため、最後の出力は'z'のみになる。