『詳細 正規表現 第三版』は正規表現の名著だが、Perl, Java, .NET, PHP, Pythonの例は載っていもRubyは載っていない。
なので、補完と勉強のため、Ruby版のコードを書いていく。
環境
Ruby 2.6.0
3.2.2 ^Subject: (.*) のサンプル
メールのデータから、タイトルを抜き出すための正規表現のサンプル。
Rubyでは正規表現リテラルで直接表す事ができる(便利!)。
文字列を正規表現にコンパイルすることもできるが、リテラルを使うこの方が多そう。
/i
で大文字小文字を区別しないように設定できる。
Rubyでは、オブジェクト指向型のアプローチを取る。
r = /^Subject: (.*)/i
m = r.match(line)
if m
subject = m[1]
end
もしマッチすれば、m
にはMatchData
objectが入り真偽値がtruthyに、
マッチしなければnil
となり、真偽値がfalsyになる。
m[1]
から順番に、()
でキャプチャした部分を取り出すことができる。
ちなみに
単にマッチしたかどうかを調べたければ、
if line =~ r
という記法も使える。
この場合、line =~ r
の返り値はマッチしていればマッチした文字列の位置が返ってくるのでtruthyとなり、
マッチしなければnilになるのでfalsyになる。
処理効率的には
if r.match?(line)
の方が良いらしいが、深くはわからない。
3.2.3 置換のサンプル
文章内のメールアドレスをリンクに置き換える処理をする。
r = /
\b
# メールアドレスを\1にキャッチする
(
\w[-.\w]*
@
[-\w]+(\.[-\w]+)*\.(com|edu|info)
)
\b
/ix
text.gsub!(r, '<a href="mailto:\1">\1</a>)')
Rubyでは、置換の場合sub
、全置換の場合gsub
を使う。
gsub
は元の文字列を置き換えず、新しい文字列を返すが、
gsub!
は元の文字列を置き換える。
/x
オプションを用いることで、正規表現内での改行とコメントを無視している。
続きはまた今度。