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

How to check whether a string contains a substring in Ruby?

我有一个字符串变量,其内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
varMessage =  
           "hi/thsid/sdfhsjdf/dfjsd/sdjfsdn
"



           "/my/name/is/balaji.so
"

           "call::myFunction(int const&)
"

           "void::secondFunction(char const&)
"

             .
             .
             .
           "this/is/last/line/liobrary.so"

在上面的字符串中,我必须找到一个子字符串,即

1
2
3
4
5
6
7
8
"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn
"



"/my/name/is/balaji.so
"

"call::myFunction(int const&)
"

我怎么能找到它?我只需要确定子字符串是否存在。


您可以使用include?方法:

1
2
3
4
my_string ="abcdefg"
if my_string.include?"cde"
   puts"String includes 'cde'"
end


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

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

这也适用于多行字符串。

请参见Ruby的regexp类。


你也可以这样做…

1
2
3
4
5
6
7
8
9
my_string ="Hello world"

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

# => 'It has"Hello"'


扩展Clint Pachl的答案:

Ruby中的regex匹配在表达式不匹配时返回nil。执行此操作时,将返回匹配发生的字符的索引。例如

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

重要的是要注意,在Ruby中,只有nil和布尔表达式false的值为false。其他所有内容(包括空数组、空哈希或整数0)的计算结果都为true。

这就是为什么上面的/foo/example有效,以及为什么

1
if"string" =~ /regex/

按预期工作。仅当匹配发生时输入if块的"true"部分。


在Rails(3.1.0及以上版本)中,有一个比上面接受的答案更简洁的习惯用法是.in?

例如:

1
2
3
4
5
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。)


三元法

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

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


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

[]中,可以是文本子字符串、索引或regex:

1
2
3
4
5
6
> s='abcdefg'
=>"abcdefg"
> s['a']
=>"a"
> s['z']
=> nil

由于nil在功能上与false相同,并且从[]返回的任何子串都是true,因此您可以像使用方法.include?一样使用逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
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"

请确保不要将索引与子字符串混淆:

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

您还可以使用regex:

1
2
3
4
> s[/A/i]
=>"a"
> s[/A/]
=> nil


1
2
3
4
5
6
user_input = gets.chomp
user_input.downcase!

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

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

1
2
3
4
5
6
7
8
9
10
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

How to check whether a string contains a substring in Ruby?

当您说"检查"时,我假设您希望返回一个布尔值,在这种情况下,您可以使用String#match?match?接受字符串或regex作为它的第一个参数,如果它是前者,那么它将自动转换为regex。所以您的用例是:

1
2
3
4
5
6
str = 'string'
str.match? 'strings' #=> false
str.match? 'string'  #=> true
str.match? 'strin'   #=> true
str.match? 'trin'    #=> true
str.match? 'tri'     #=> true

String#match?具有可选的第二个参数的额外好处,该参数指定了从中搜索字符串的索引。默认设置为0

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