Rubyの文字列比較とは?詳しい内容をご紹介!

- システム
エンジニア - Rubyの文字列比較で使用する演算子を使いこなせるようになりたいです。
- プロジェクト
マネージャー - 見た目が似ている演算子があるので、しっかりと覚えていきましょう。
Rubyの文字列比較
今回は、Rubyでの文字列比較について説明します。Rubyの文字列比較には様々な演算子が用意されており、用途に応じて使い分ける必要があります。
見た目が似ている演算子もあるので、初心者は混乱しやすいかもしれません。Rubyの文字列比較に興味のある方はぜひご覧ください。
比較のための演算子
Rubyの文字列比較には、「等号比較演算子」または「不等号比較演算子」を使用します。
等号比較演算子は、文字列が等しいか否かを判断する演算子で、「==」・「===」・「eql?」・「equal?」の4つがあります。不等号比較演算子は、文字列の大小を判断する演算子で、「<�」・「>」・「<=」・「>=」の4つがあります。
文字列比較について、以下で詳しく説明していきます。
等号比較演算子「==」
Rubyの等号比較演算子「==」は、文字列の「値」が一致しているか否かを判断します。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
|
str1 = "hoge"
str2 = "hoge"
puts str1 == str2 # true
puts str1 != str2 # false
puts str1 == "hoge" # true
|
実行結果は以下のようになります。
1
2
3
|
true
false
true
|
str1とstr2の値”hoge”が一致しているので、「==」演算子はtrueを返します。また、「==」の否定は「!=」です。変数と文字列を直接比較することもできます。
このように、等号比較演算子「==」は、文字列の「値」が一致しているか否かを判断します。
等号比較演算子「===」
Rubyの等号比較演算子「===」については、以下の使い方があります。
・「==」と同じ
・case文で暗黙的に使用される比較演算子
・インスタンスの判断
・範囲オブジェクトの判断
・正規表現オブジェクトの判断
以降の章で詳しく説明していきます。
「==」と同じ
演算子の左辺が文字列や数字の場合、先ほど説明した「==」と同じ判断をします。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
|
str1 = "hoge"
str2 = "hoge"
puts str1 === str2 # true
#puts str1 !== str2 # !==演算子はない
|
実行結果は以下のようになります。
1
|
true
|
値が一致しているか否かを判断しているので、「==」と同じです。
また、「===」の否定演算子はありません。if-elseもしくはunlessで否定側のロジックを作成してください。
case文で暗黙的に使用される比較演算子
「===」は、case文で暗黙的に使用される比較演算子です。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
str1 = "hoge"
case str1
# str1 === "hoge"のときに実行したい文
when "hoge" then puts "hoge"
# str1 === "piyo"のときに実行したい文
when "piyo" then puts "piyo"
# それ以外
else puts "other"
end
|
実行結果は以下のようになります。
1
|
hoge
|
ここでは、内部的にstr1 === “hoge”が実行されています。
このように、「===」は、case文で暗黙的に使用される比較演算子です。
インスタンスの判断
「===」の左辺がクラスオブジェクトの場合、右辺がそのインスタンスであるか否かを判断します。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
|
str1 = "hoge"
puts String === str1 # true
puts Integer === str1 # false
|
実行結果は以下のようになります。
1
2
|
true
false
|
str1はStringクラスのインスタンスなので、「===」はtrueを返します。
また、str1はIntegerクラスのインスタンスではないので、falseを返します。
このように、「===」の左辺がクラスオブジェクトの場合、右辺がそのインスタンスであるか否かを判断します。
範囲オブジェクトの判断
「===」の左辺が範囲オブジェクトの場合、右辺がその範囲に含まれているか否かを判断します。
実際のソースコードを見てみましょう。
1
2
3
4
|
puts (1..5) === 2 # 1~5の間なのでtrue
puts ('a'..'e') === "f" # a~eの間ではないのでfalse
|
実行結果は以下のようになります。
1
2
|
true
false
|
このように、「===」の左辺が範囲オブジェクトの場合、右辺がその範囲に含まれているか否かを判断します。
正規表現オブジェクトの判断
「===」の左辺が正規表現オブジェクトの場合、右辺がその正規表現に一致するか否かを判断します。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
|
str1 = "hoge123"
puts /hoge[0-9]{3}/ === str1 # true
puts /hoge[0-9]{4}/ === str1 # false
|
実行結果は以下のようになります。
1
2
|
true
false
|
このように、「===」の左辺が正規表現オブジェクトの場合、右辺がその正規表現に一致するか否かを判断します。
等号比較演算子「eql?」
Rubyの等号比較演算子「eql?」は、「==」と同じ判断をします。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
|
str1 = "hoge"
str2 = "hoge"
puts str1.eql?str2 # true
puts str1.eql?("hoge") # true
|
実行結果は以下のようになります。
1
2
|
true
true
|
このように「eql?」は、「==」と同じ判断をします。
同じなのになぜ「eql?」演算子が存在するのでしょうか?
「eql?」の存在意義は、可読性の向上です。
また、「==」で比較しようとして誤って「=」で代入してしまうことを防ぐために、「eql?」で比較しても良いでしょう。
このあたりは開発チーム内でコーディング規約があれば従ってください。
等号比較演算子「equal?」
Rubyの等号比較演算子「equal?」は、オブジェクトが一致しているか否かを判断します。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
|
str1 = "hoge"
str2 = "hoge"
puts str1.equal?str1 # true
puts str1.equal?str2 # false
puts str1.equal?("hoge") # false
|
実行結果は以下のようになります。
1
2
3
|
true
false
false
|
このように「equal?」は、文字列が一致しているかではなく、オブジェクトが一致しているか否かを判断します。
不等号比較演算子
Rubyの文字列比較に使用する不等号比較演算子は、以下の4つがあります。
・小なり演算子 < ・大なり演算子 >
・以下演算子 <= ・以上演算子 >=
文字列の不等号比較演算子は、辞書で先に出てくるか否かを判断します。
例えば、「”a”の方が”b”よりも先に出てくる」「”a”の方が”A”よりも先に出てくる」などです。
先に出てくるほうが小さい値として判断されます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
|
puts "a" < "b" # true
puts "A" > "a" # false
puts "aa" <= "ab" # true
puts "Aa" >= "Ab" # false
|
実行結果は以下のようになります。
1
2
3
4
|
true
false
true
false
|
このように、Rubyにおける文字列の不等号比較演算子は、辞書で先に出てくるか否かを判断します。
- システム
エンジニア - 演算子の例を並べて説明してくださったので、わかってきました。
- プロジェクト
マネージャー - 実際に書いてみて、用途に応じた使い分けができるようにしておきましょう。
Rubyの文字列比較について理解しよう
いかがでしたでしょうか。Rubyの文字列比較には、等号比較演算子や不等号比較演算子があり、用途に応じて使い分ける必要があります。
文字列比較して値が一致しているか、オブジェクトが一致しているか、範囲に含まれているか、正規表現に一致するか、など様々な文字列比較ができます。
「==」と「===」、「eql?」と「equal?」など、見た目が似ている演算子があるので注意が必要です。ぜひご自身でソースコードを書いて、文字列比較についての理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Ruby新着案件New Job
-
RedmineプラグインおよびWEB開発/Ruby/東京都中央区/【WEB面談可】/在宅勤務
月給65万~65万円東京都中央区(新富町駅) -
Webアプリケーション運用保守/Ruby/東京都江東区/【WEB面談可】
月給50万~60万円東京都江東区(亀戸駅) -
Webアプリケーション開発(既存機能改修)のテスター/Ruby/東京都江東区/【WEB面談可】
月給25万~35万円東京都江東区(亀戸駅) -
Webアプリケーション開発(既存機能改修)/Ruby/東京都江東区/【WEB面談可】
月給45万~60万円東京都江東区(亀戸駅) -
Ansibelの自動構築/Ruby/東京都台東区/【WEB面談可】/テレワーク
月給46万~48万円東京都台東区(浅草駅) -
会計ワークフローの開発/Ruby/東京都新宿区/【WEB面談可】/フルリモート
月給46万~48万円東京都新宿区(新宿駅)