MAGAZINE

ルーターマガジン

Ruby

スクレイピングの文字列抽出でよく使うRubyの正規表現

2018.12.28
Pocket

初めまして、学生アルバイトのitogaです。

僕が2ヶ月前に初めて正規表現を見たときは、思わずブラウザバッグを押したくなったものですが、上手く使いこなせるようになると非常に便利です。

今回は、Rubyでの正規表現の使い方について簡単に説明してこうと思います。
※正規表現そのもののお作法については、本記事では割愛させて頂きます。

そもそも正規表現とは

僕もあまりよくわかっていませんが、正規表現=文字列のパターンを示す表現 という認識で問題ないと思います。
パターンを示す表現なので、文字列のパターン検索で役に立ちます。また、正規表現は、Ruby独自のものではないので、linuxやjavaなど様々な言語で使うことが出来ます。

正規表現の使い方

Rubyでは正規表現は以下のようにスラッシュ"/"で囲って使われます。

test = /a/
p test        // => /a/
p test.class  // => Regexp
str = "/a/"
p str         // => "/a/"
p str.class   // => String
クラスはRegexpクラスのようです。

Ruby正規表現の具体的な使用例

・Ruby標準メソッドの引数で

Rubyの標準メソッドでは正規表現を引数として与えることができるものが多くあります。
その中でも、ここではgsubを紹介します。

str = "hogeapple"
res = str.gsub(/hoge/,"")
p res  // => "apple"
これくらいなら正規表現じゃなくても出来るよ!!って思ったそこのあなた。
これは出来ますか?
str = "banana130yen,apple100yen"
res = str.gsub(/\d*yen/,"")
p res  // => "banana,apple"
\dは数字、それに*がくっつくと、連続する数字という意味になります。
このような抽象的な概念が扱えることが正規表現の強みでもあります。

・[ ]メソッドで切り出し

str = "hogefugapplefugahoge"
res = str[/apple/]
p res  // => "apple"
より実用的なサンプルは以下。
str = "banana130(141)yen,apple100(108)yen"
res = str[/apple.*\(\d*\)yen/]
p res "apple100(108)yen"
正規表現内での( )は特別な意味を持っているので、文字として( )を表したいときは、上のようにバックスラッシュをくっつけます。
いわゆる予約語のエスケープですね
第2引数で1を与えると、正規表現内で()で括った中身を返してくれます。デフォルトは0です。
str = "banana130(141)yen,apple100(108)yen"
res = str[/apple.*\((\d*)\)yen/,1]
p res  // => "108"

・[ ]メソッドで置換

以下のようにすると破壊的に置換します。

str = "hogefugapplefugahoge"
str[/apple/] = "banana"
p str  // => "hogefugbananafugahoge"

・=== でtrue or false

いわゆるboolean型ですね。
左に正規表現を置くことに注意です。左右逆にするとfalseしか返されません。

str = "apple100(108)yen"
is_apple = /apple/ === str
p is_apple   // => true
is_banana = /banana/ === str
p is_banana  // => false

さいごに

いかがでしたか?
正規表現は他言語でも使えることが多いので、文字列について扱うのであれば是非とも習得しておきたいですね。

他にも弊社では様々な便利ツールを紹介していますので、是非見て行ってください。
ルーターのブログたち

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから