次のような内容の文字列変数があります。
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"
どうやって見つけることができますか?部分文字列が存在するかどうかを判断するだけです。
include?
メソッドを使用できます。
my_string = "abcdefg"
if my_string.include? "cde"
puts "String includes 'cde'"
end
Caseが無関係の場合は、 大文字と小文字を区別しない正規表現 が適切な解決策です。
'aBcDe' =~ /bcd/i # evaluates as true
これは複数行の文字列に対しても機能します。
Rubyの Regexp classを参照してください。
またこれをすることができます...
my_string = "Hello world"
if my_string["Hello"]
puts 'It has "Hello"'
else
puts 'No "Hello" found'
end
# => 'It has "Hello"'
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'部分を入力してください。
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では利用できないことに注意してください。)
三進法
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')
[]
である 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
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
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