web-dev-qa-db-ja.com

Rubyで文字列に部分文字列が含まれているかどうかを調べる方法は?

次のような内容の文字列変数があります。

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"

どうやって見つけることができますか?部分文字列が存在するかどうかを判断するだけです。

653
BSalunke

include? メソッドを使用できます。

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

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

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

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

Rubyの Regexp classを参照してください。

77
Clint Pachl

またこれをすることができます...

my_string = "Hello world"

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

# => 'It has "Hello"'
37
Oto Brglez

Clint Pachlの答えを拡大する:

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ブロックの 'true'部分を入力してください。

29
acib708

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

また、読みやすくなっていると思います。

c.f http://apidock.com/Rails/v3.1.0/Object/in%3F

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

17
stwr667

三進法

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

OR

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

[]である String Element Reference メソッドを使用できます。

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

> 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
9
dawg
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
2
Prabhakar

Rubyで文字列に部分文字列が含まれているかどうかを調べる方法は?

あなたが 'check'と言ったとき、私はあなたが 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
1
Sagar Pandya