如何在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
铁皮人

Answers:


1362

您可以使用以下include?方法:

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

102
请记住,这include?是区分大小写的。因此,如果my_string在上面的示例中将是类似的内容"abcDefg"(带有大写字母D),include?("cde")则将返回false。您可能需要downcase()在致电之前做一个include?()
phortx

4
单独包含是不理想的,因为如果nil test = nil test.include?(“ test”)NoMethodError:未定义的方法“ include?”,则可能引发NoMethodError。for nil:NilClass应该始终将要包含的值转换为期望值:-test.to_s.include?(“ test”)
加里(Gary

如果您的目标是最小化代码这一部分中引发的异常, @Gary的建议成立。这并不总是最好的目标。通常,如果您期望代码中的这时有一个字符串,而值为nil,则表示发生了意外情况,并且引发了异常是适当的。如果此处意外存在nil,则使用to_s会隐藏问题,并增加源与问题检测之间的距离,从而使调试更加困难。
Luke Griffiths

88

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

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

这也适用于多行字符串。

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


11
如果要匹配用户输入并使用此技术,请记住Regexp.escape在字符串上使用。对于大多数用例,some_str.include? substr.downcase()应该工作得更快并且更具可读性。
2015年

4
使用正则表达式不一定会比使用正则表达式快'aBcDe'.downcase.include?('bcd')。正则表达式有其用途,但是当内置方法更快时,不要使用它们。用测试的实际数据进行基准测试可以揭示很多内容。
Tin Man

3
这不算是正确的。计算结果为1,这是不正确的。
slindsey3000

2
!!('aBcDe'=〜/ bcd / i)将评估为true或false。使用 !!成语
slindsey3000

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

4
#include?当您使用内部带有空格的句子时,该选项将不起作用,因为#include它将句子拆分为单词,然后将单词用作单独的数组值。这非常适合句子。+1
luissimo

有关[]更多信息,请参见Ruby的String 方法。
锡人

32

扩展Clint Pachl的答案:

nil当表达式不匹配时,Ruby中的正则表达式匹配将返回。完成后,将返回匹配发生处的字符的索引。例如:

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

请务必注意,仅在Ruby中nil,布尔表达式的false计算结果为false。其他所有内容,包括一个空的Array,空的Hash或Integer 0,都评估为true。

这就是/foo/上面的示例起作用的原因,也是为什么。

if "string" =~ /regex/

可以按预期工作,只有在if发生匹配时才输入块的“ true”部分。


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

2
没错,尽管由于相当多的Ruby开发人员正在使用Rails,但由于其简洁明了,我认为这可能是某些人的首选解决方案。
stwr667

1
请参阅stackoverflow.com/a/4239625/128421。它位于Rails中,但是可以使用Rails的Active Support Core Extensions从常规的Ruby轻松访问,该扩展允许轻松挑选少量方法(例如only)in?
锡人

正确@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
这是惊人的
Craig

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?具有可选的第二个参数的附加好处,该参数指定了从中搜索字符串的索引。默认情况下设置为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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.