railsがんばる子

Ruby on Railsがんばる子です。胡蝶蘭のECサイトを運営しています。

Rubyの正規表現を複数行に分けて名前付きキャプチャをする

目的

  • 整頓されていないテキストデータをrubyで取り扱いたい
  • コンテンツデータを作る人は、プログラマーではないことが多いので、スペースや改行、フォーマットなどを気にしない

解決策

  • 正規表現でキャプチャする
  • 名前キャプチャを出来ると便利(可読性UP)
  • 長くなるので複数行で正規表現を定義したい(可読性UP)

早速

# コロンの後にスペースが有ったり無かったりしますよね
# 各項目について改行があったりなかったりしますよね
raw_text = "
お名前:にゃあはらさん
メールアドレス: akb48@nyaahara.comお電話番号:教えられないよ!"

# \s? を使ってスペースがあってもなくてもマッチング
# \n?を使って改行があってもなくてもマッチング
# (?<name>pattern) で指定した変数名(name)にキャプチャした結果を投入します。
/
  お名前:\s?(?<name>.+)\n?
  メールアドレス:\s?(?<email>.+)\n?
  お電話番号:\s?(?<phone_number>.+)\n?
/xi =~ raw_text
# xiオプションを指定すると、改行やスペースを無視してくれます
          

実行結果サンプル

[1] pry(main)> raw_text = "
[1] pry(main)* お名前:にゃあはらさん
[1] pry(main)* メールアドレス: akb48@nyaahara.comお電話番号:教えられないよ!"
=> "\nお名前:にゃあはらさん\nメールアドレス: akb48@nyaahara.comお電話番号:教えられないよ!"

[2] pry(main)> /
[2] pry(main)*   お名前:\s?(?<name>.+)\n?
[2] pry(main)*   メールアドレス:\s?(?<email>.+)\n?
[2] pry(main)*   お電話番号:\s?(?<phone_number>.+)\n?
[2] pry(main)* /xi =~ raw_text
=> 1

[3] pry(main)> name
=> "にゃあはらさん"

[4] pry(main)> email
=> "akb48@nyaahara.com"

[5] pry(main)> phone_number
=> "教えられないよ!"          

参考リンク

Ruby の正規表現を複数行で書く