0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

『詳細 正規表現 第三版』のRuby(2.6.0)版

Last updated at Posted at 2019-01-29

『詳細 正規表現 第三版』は正規表現の名著だが、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にはMatchDataobjectが入り真偽値が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オプションを用いることで、正規表現内での改行とコメントを無視している。

続きはまた今度。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?