Rubyで正規表現を使用して一致する文字列を検索したい
Rubyで検索する方法はたくさんあるけど、やり方をすぐ忘れてしまう
Rubyで検索するためのメソッドはたくさん用意されていますが、どんなときにどのメソッドを使えばいいのか、全てを理解している方は少ないのではないでしょうか?
こんにちは!エンジニアとしてさまざまな開発に携わってきたヤマシタです。この記事ではRubyで検索する方法についてパターン別におすすめの検索方法を解説していきます。
Rubyを勉強し始めた初心者の方に必見の内容となりますので、ぜひ最後まで読んでいただいて、Rubyで検索する方法について理解を深めていただければと思います。
この記事はこんな人のために書きました
- Rubyで検索する方法の基礎について学びたい方
- パターン別に検索する方法について知りたい方
Rubyで検索する方法について、網羅的に解説していますのでぜひ参考にしてください。
Rubyで検索する3つのパターン
冒頭でも触れましたがRubyで文字列を検索する方法はたくさんあります。しかし、種類がありすぎてどんなときにどんなメソッドを使えばいいのか?忘れてしまいがちです。
実際の業務でも以下のような3つのパターンに直面することも多いと言えるでしょう。
- 文字列の中に指定した文字列が含まれているか知りたい
- 配列の要素に指定した文字列が含まれているか知りたい
- 正規表現で一致した文字列を抽出する方法を知りたい
この記事では検索するときによく使用する以下のメソッドについてそれぞれ解説していきます。
メソッド | 動作 | 返り値 |
---|---|---|
index | 指定した文字列を検索 | 文字列の位置 |
include? | 指定した文字列を検索 | 真偽値 |
select | 条件に一致した要素を取得 | 一致した要素の配列 |
reject | 条件に一致しない要素を取得 | 一致しない要素の配列 |
grep | 正規表現にマッチした要素を取得 | マッチした要素の配列 |
match | 正規表現にマッチした部分文字列を取得 | マッチした文字列 |
slice | マッチした最初の文字列を取得 | マッチした文字列 |
Rubyで文字列を検索する方法
indexメソッド
indexメソッドは文字列の中に特定の文字列が含まれているか、確認するためのメソッドです。
indexの書き方
文字列.index(検索文字列)
文字列の中に検索文字列が含まれていた場合は、その文字列の位置(何文字目か?)を返します。検索文字列が含まれていなかった場合はnilを返します。
# 文字列を定義 fruits = "apple,orange,melon,banana,pineapple" # 一致する文字列を検索 p fruits.index("apple") p fruits.index("orange") p fruits.index("banana") p fruits.index("mango")
実行結果:
0 6 19 nil
実行結果のように文字列fruitsにindexメソッドを実行し、引数に文字列を指定することによって、文字列が見つかった場合は文字列の位置を返します。appleなら0文字目、orangeなら6文字目、mangoは存在しないためnilを返していることがそれぞれわかりますね。
include?メソッド
include?メソッドはindexメソッドと同様に指定した文字列を検索するメソッドです。indexメソッドとの違いとして、検索文字列が見つかった場合はtrueを、見つからなかった場合はfalseを返します。
include?の書き方
文字列.include?(検索文字列)
指定した文字列が存在するか、確認したいだけの場合に便利ですので、ぜひ使い方は覚えておいてください。
# 文字列を検索 fruits = "apple,orange,melon,banana,pineapple" # 一致する文字列を検索 p fruits.include?("apple") p fruits.include?("orange") p fruits.include?("banana") p fruits.include?("mango")
実行結果:
true true true false
このようにinclude?メソッドの引数に指定した文字列が見つかったらtrue、見つからなかった場合はfalseを返していることがわかりますね。
include?メソッドは真偽値を返すため、そのまま条件式として使用することもできます。
# 文字列を検索 fruits = "apple,orange,melon,banana,pineapple" # 条件によって処理を分岐 if fruits.include?("apple") then p "appleが見つかりました。" else p "appleが見つかりませんでした。" end
実行結果:
"appleが見つかりました。"
Rubyのif文については、以下の記事で詳細に解説していますのでぜひ参考にしてください。
Rubyで配列を検索する方法
selectメソッド
selectメソッドは条件式に一致した要素を取得するためのメソッドです。
selectの書き方
配列オブジェクト.select { |変数| ブロック処理 }
波括弧{}で囲った変数に要素を一つずつ格納していき、ブロック処理が真になった場合に要素を取得していきます。ブロック処理が真となった要素は新しい配列として返されます。
array = [1,2,3,4,5] p array.select { |num| num > 3 } p array.select { |num| num == 3 } p array.select { |num| num <= 3 }
実行結果:
[4, 5] [3] [1, 2, 3]
実行結果のように、1番目では3以上、2番目は3と一致したもの、3番目は3以下という条件を満たしたものを返しています。戻り値は配列が返されていることもわかりますね。
また、以下のように文字列に対しても検索することが可能です。
fruits = ["apple","orange","banana","melon","pineapple"] p fruits.select { |item| item.include?("apple") } p fruits.select { |item| item.include?("orange") } p fruits.select { |item| item.include?("mango") }
実行結果:
["apple", "pineapple"] ["orange"] []
このサンプルではブロック処理でinclude?メソッドを使用して指定した文字列が存在した場合は、新しい配列を作成しています。そんなselectメソッドについては以下の記事でも詳しく紹介していますので、ぜひ参考にしてください。
rejectメソッド
rejectメソッドは配列の要素分ブロックの処理を実行し、条件が偽の要素のみを取得するメソッドです。ブロック処理が偽となった要素は新しい配列として返されます。
rejectの書き方
配列オブジェクト.reject {|変数| ブロック}
波括弧{}で囲った変数に要素を一つずつ格納していき、ブロック処理が偽になった場合に要素を取得していきます。ブロック処理が偽となった要素は新しい配列として返されます。
# 配列を定義 array = [1,2,3,4,5] # 偽の要素を取得 p array.reject { |num| num > 3 } p array.reject { |num| num == 3 } p array.reject { |num| num <= 3 }
実行結果:
[1, 2, 3] [1, 2, 4, 5] [4, 5]
1番目では3以上、2番目は3と完全に一致したもの、3番目は3以下という条件の結果が満たしていないもの返しています。先に紹介したselectメソッドとは全く逆の結果であることがわかりますね。
Rubyの正規表現で検索する方法
ここでは正規表現で文字列を検索するgrep、match、sliceメソッドについてそれぞれ解説していきます。
- そもそも正規表現とは
- 正規表現は主にパターンにマッチした文字列を取得するために使われるもので、あらゆる文字列を検証することができます。
例えば[A-Z]ではアルファベットのAからZまでを表現し、数字の[0-9]では数値の0から9までを表現します。
grepメソッド
grepメソッドは引数に指定した正規表現のパターンが一致した要素を取得して配列として返すメソッドです。
grepの書き方
配列.grep(オブジェクト)
以下ではgrepメソッドの引数に正規表現で数字の[0-9]、文字列の[a-z]を指定して、パターンにマッチした要素を取得しています。
# 配列を定義 array = ["1111", "apple", "2222", "orange", "3333", "melon"] # 数字の0-9 p array.grep(/^[0-9]+$/) # アルファベットのaからz p array.grep(/^[a-z]+$/)
実行結果:
["1111", "2222", "3333"] ["apple", "orange", "melon"]
最初の引数では数字の0〜9だったら取得するパターンを指定し、2番めの引数にはアルファベットのa-zだったら取得する正規表現のパターンを指定しています。
grepメソッドについては以下の記事でも詳しく解説していますので、ぜひ参考にしてください。
matchメソッド
matchメソッドは正規表現にマッチした部分文字列を取得します。
matchメソッドの書き方
オブジェクト名.match(/正規表現/)
以下では”の勉強”が含まれている文字列を取得しています。
str = "Rubyの勉強, Railsの学習" md = str.match(/.*の勉強/) p md[0] str = "Rubyの勉強, Railsの勉強" md = str.match(/.*の勉強/) p md[0]
実行結果:
"Rubyの勉強" "Rubyの勉強, Railsの勉強"
このようにそれぞれ指定した正規表現にマッチした文字列が取得できていることがわかりますね。
matchメソッドについては以下の記事でも詳しく解説しています。
sliceメソッド
sliceメソッドは正規表現のパターンにマッチした部分文字列を取得します。指定したパターンが存在しない場合はnilを返します。
sliceの書き方
オブジェクト名.slice(/正規表現/)
以下ではsliceメソッドを使用して正規表現にマッチした最初の文字列を取り出しています。
# 文字列を定義 str = "1111apple2222orange3333melon" # aから始まる文字列 p str.slice(/a..../) # 2から始まる文字列 p str.slice(/2.../) # 存在しない場合はnil p str.slice(/c...../)
実行結果:
"apple" "2222" nil
sliceメソッドのさまざまな使い方については、以下の記事でも詳しく解説しています。
Rubyについてもっと学びたい方へ
ここでは、Rubyで検索するさまざまな方法について解説していきました。プログラミングを理解するためには、たくさんのトライ・アンド・エラーが必要です。
Rubyの使い方についてもっとよく知りたい
Rubyのスキルを身に着けられるか不安…
Rubyを体系的に理解したい
と感じている方は以下の記事も合わせてご覧ください。Rubyの基礎の基礎から勉強法などを体系的にまとめていますので、きっと参考になるのではと思います。
まとめ
今回はRubyで検索する方法について、検索の方法を3つのパターン別に解説しました。Rubyで検索するにはさまざまな方法があることがわかったと思います。
実際の業務ではこれらのメソッドを駆使してさまざまな処理を行うことになりますので、使い方についてはしっかりとマスターしておきましょう。