如何在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"

怎么找?我需要确定子串有没有

946160 次浏览

您可以使用include?方法:

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

如果case不相关,那么不区分大小写的正则表达式是一个很好的解决方案:

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

这也适用于多行字符串。

有关更多信息,请参阅Ruby的Regexp类。

你也可以这样做……

my_string = "Hello world"
if my_string["Hello"]puts 'It has "Hello"'elseputs 'No "Hello" found'end
# => 'It has "Hello"'

此示例使用Ruby的String#[]方法。

三元法

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')

在Rails中(从3.1.0及更高版本)比上面可接受的答案更简洁的习惯用法是.in?

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

我也认为它更具可读性。

查看in?留档了解更多信息。

请再次注意,它仅在Rails中可用,而不是纯Ruby。

扩展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”部分。

user_input = gets.chompuser_input.downcase!
if user_input.include?('substring')# Do somethingend

这将帮助您检查字符串是否包含子字符串

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

if user_input.include?('s')puts "Found"elseputs "Not found"end

您可以使用字符串元素引用方法,即[]

[]内部可以是文字子字符串、索引或正则表达式:

> 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> else1*    puts "\"#{s}\" does not have \"#{sub_s}\""1> end"abcdefg" has "abc"
0> if s[sub_s]1>    puts "\"#{s}\" has \"#{sub_s}\""1> else1*    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

你也可以使用regex:

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

如何在Ruby中检查字符串是否包含子字符串?

当你说'check'时,我假设你想要返回一个布尔值,在这种情况下你可以使用String#match?match?接受字符串或正则表达式作为它的第一个参数,如果它是前者,那么它会自动转换为正则表达式。所以你的用例是:

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

String#match?还有一个可选的第二个参数的好处,它指定了一个索引来搜索字符串。默认情况下,它设置为0

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

如果你不能使用上面提到的库之一,可以通过简单的文本搜索来实现相同的目的(这是因为downcase而忽略的情况):

ADD_BUTTON_TEXTS = ["add to cart", "add to basket"].freezetarget_text = "AdD tO cArT"ADD_BUTTON_TEXTS.each do |text|puts "Text was found" if target_text.downcase.include?(text)end