Rubyで文字列に部分文字列が含まれているかどうかを確認する方法


731

私は内容を持つ文字列変数を持っています:

varMessage =   
            "hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"


            "/my/name/is/balaji.so\n"
            "call::myFunction(int const&)\n"
            "void::secondFunction(char const&)\n"
             .
             .
             .
            "this/is/last/line/liobrary.so"

文字列で私は部分文字列を見つける必要があります:

"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"

"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"

どうすれば見つけられますか?サブストリングが存在するかどうかを確認する必要があります。



これを行うさまざまな方法の詳細については、stackoverflow.com / a / 3878656/128421を参照してください。
Tin Man

回答:


1366

次のinclude?方法を使用できます。

my_string = "abcdefg"
if my_string.include? "cde"
   puts "String includes 'cde'"
end

103
include?大文字と小文字が区別されることを忘れないでください。したがって、my_string上の例で"abcDefg"(大文字のD)のような場合は、include?("cde")が返されfalseます。をdowncase()呼び出す前にaを実行することをお勧めしますinclude?()
phortx 2014年

4
nil test = nil test.include?( "test")NoMethodError:undefined method `include? 'の場合、それ自体でインクルードすることは、NoMethodErrorをスローする可能性があるため、理想的ではありません。nil:NilClassは常に、含まれている値を期待値に変換する必要があります。-test.to_s.include?( "test")
Gary

@Garyのアドバイスは、コードのこの部分で発生する例外を最小限に抑えることが目標である場合に当てはまります。それが常に最良の目標であるとは限りません。一般に、コードのこの時点で文字列を予期し、値がnilである場合、それは予期しない何かが発生したことを意味し、発生した例外が適切です。ここでnilが存在することが予期されない場合、を使用to_sすると問題が隠され、ソースと問題の検出の間の距離が長くなるため、デバッグが困難になります。
ルークグリフィス

88

大文字と小文字が区別されない場合は、大文字と小文字を区別しない正規表現が適切な解決策です。

'aBcDe' =~ /bcd/i  # evaluates as true

これは複数行の文字列でも機能します。

詳細については、RubyのRegexpクラスを参照してください。


11
ユーザー入力と照合してこの手法を使用する場合Regexp.escapeは、文字列で使用することを忘れないでください。ほとんどの使用例でsome_str.include? substr.downcase()は、より速く動作し、読みやすくなります。
ジャック

4
この方法で正規表現を使用しても、を使用するよりも高速であるとは限りません'aBcDe'.downcase.include?('bcd')。正規表現には目的がありますが、組み込みメソッドの方が高速な場合は使用しないでください。テスト対象の実際のデータでベンチマークを行うと、多くのことが明らかになります。
ティンマン

3
これは真として評価されません。1と評価され、真ではありません。
slindsey3000 2018年

2
!!( 'aBcDe' =〜/ bcd / i)は、trueまたはfalseに評価されます。使用 !!イディオム
slindsey3000 2018年

2
または、一致を使用しますか?ブール値を返すには:/bcd/i.match?('aBcDe')
ferrell_io

45

これもできます...

my_string = "Hello world"

if my_string["Hello"]
  puts 'It has "Hello"'
else
  puts 'No "Hello" found'
end

# => 'It has "Hello"'

この例では、RubyのString #[]メソッドを使用しています。


2
これは私が今まで見たことのないきちんとしたトリックです。しかし#include?、まだ少し速いです。
Scott Schupbach 2017年

4
#include?内部にスペースがある文を処理しているときは#include、文を単語に分割し、単語を別の配列値として使用するため、機能しません。これは文に対して完全に機能します。+1
luissimo

詳細については、RubyのString []メソッドを参照してください。
ティンマン

32

クリント・パックルの答えをさらに詳しく:

Rubyの正規nil表現一致は、式が一致しない場合に返されます。その場合、一致が発生した文字のインデックスを返します。例えば:

"foobar" =~ /bar/  # returns 3
"foobar" =~ /foo/  # returns 0
"foobar" =~ /zzz/  # returns nil

Rubyのみnilでブール式falseがfalseに評価されることに注意することが重要です。空の配列、空のハッシュ、または整数0を含むその他すべては、trueと評価されます。

/foo/上記の例が機能するのはこのためです。

if "string" =~ /regex/

期待どおりに機能しif、一致が発生した場合にのみブロックの「真」の部分を入力します。


21

Railsで利用可能な上記の受け入れられた回答よりも簡潔なイディオム(3.1.0以降)は.in?次のとおりです。

my_string = "abcdefg"
if "cde".in? my_string
  puts "'cde' is in the String."
  puts "i.e. String includes 'cde'"
end

また、もっと読みやすいと思います。

詳細については、in?ドキュメントを参照してください。

これはRailsでのみ利用可能であり、純粋なRubyでは利用できないことに注意してください。


2
これはレールに依存し、OPはルビーの解決策を求めていました
dft '13年

2
そうです、Ruby開発者のかなりの割合がRailsを使用しているので、その明快さと簡潔さのために、これは一部にとって好ましい解決策かもしれないと思いました。
stwr667 2017年

1
stackoverflow.com/a/4239625/128421を参照してください。これはRailsにありますが、RailsのActive Support Core Extensionsを使用して通常のRubyから簡単にアクセスできます。これにより、だけのようなメソッドの小さなグループを簡単に選択できin?ます。
Tin Man

@theTinManを修正してください。"cde".in? my_string純粋なルビーの収量NoMethodError。しかし、require 'active_support/core_ext/object/inclusion'それは機能し、それはRails自体から、または削減されたActive Support Core Extensionsからロードできます。
stwr667

16

三元法

my_string.include?('ahr') ? (puts 'String includes ahr') : (puts 'String does not include ahr')

または

puts (my_string.include?('ahr') ? 'String includes ahr' : 'String not includes ahr')

11

文字列要素リファレンスメソッドを使用できます。[]

内部には[]、リテラル部分文字列、インデックス、または正規表現のいずれかを指定できます。

> s='abcdefg'
=> "abcdefg"
> s['a']
=> "a"
> s['z']
=> nil

以来nil、機能的に同じであるとfalseしてから返されたいずれかのサブストリングが[]あるtrueあなたがメソッドを使用するかのようにロジックを使用することができます.include?

0> if s[sub_s]
1>    puts "\"#{s}\" has \"#{sub_s}\""
1> else 
1*    puts "\"#{s}\" does not have \"#{sub_s}\""
1> end
"abcdefg" has "abc"

0> if s[sub_s]
1>    puts "\"#{s}\" has \"#{sub_s}\""
1> else 
1*    puts "\"#{s}\" does not have \"#{sub_s}\""
1> end
"abcdefg" does not have "xyz" 

インデックスとサブ文字列を混同しないように注意してください。

> '123456790'[8]    # integer is eighth element, or '0'
=> "0"              # would test as 'true' in Ruby
> '123456790'['8']  
=> nil              # correct

正規表現を使用することもできます:

> s[/A/i]
=> "a"
> s[/A/]
=> nil

2
これは驚異的です
クレイグ

3

Rubyで文字列に部分文字列が含まれているかどうかを確認するにはどうすればよいですか?

「チェック」と言うときは、ブール値を返す必要があると思いますString#match?。その場合はを使用できます。match?文字列または正規表現を最初のパラメータとして受け入れます。前者の場合は、自動的に正規表現に変換されます。だからあなたのユースケースは次のようになります:

str = 'string'
str.match? 'strings' #=> false
str.match? 'string'  #=> true
str.match? 'strin'   #=> true
str.match? 'trin'    #=> true
str.match? 'tri'     #=> true

String#match?文字列を検索するインデックスを指定するオプションの2番目の引数の追加の利点があります。デフォルトでは、これはに設定されてい0ます。

str.match? 'tri',0   #=> true
str.match? 'tri',1   #=> true
str.match? 'tri',2   #=> false

2
user_input = gets.chomp
user_input.downcase!

if user_input.include?('substring')
  # Do something
end

これは、文字列に部分文字列が含まれているかどうかを確認するのに役立ちます

puts "Enter a string"
user_input = gets.chomp  # Ex: Tommy
user_input.downcase!    #  tommy


if user_input.include?('s')
    puts "Found"
else
    puts "Not found"
end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.