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

BSa*_*nke 692 ruby string

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

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"
Run Code Online (Sandbox Code Playgroud)

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

"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"


"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"
Run Code Online (Sandbox Code Playgroud)

我该怎么找到它?我只需要确定子串是否存在.

Ada*_*ear 1294

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

my_string = "abcdefg"
if my_string.include? "cde"
   puts "String includes 'cde'"
end
Run Code Online (Sandbox Code Playgroud)

  • 请记住,"include?"是具有案例意义的.因此,如果上面示例中的`my_string`类似于`"abcDefg"`(带有大写的`D`),`include?("cde")`将返回`false`.你可能想在调用`include?()`之前做一个`downcase()`. (95认同)
  • 如果nil test = nil test.include?("test")NoMethodError:undefined方法`include?',那么包含它本身并不理想,因为它可以抛出NoMethodError 对于nil:NilClass应始终将包含的值转换为期望值: - test.to_s.include?("test") (3认同)
  • @Gary 的建议*如果*您的目标是尽量减少这部分代码中引发的异常。这并不总是最好的目标。一般来说,如果您期望代码中此时出现一个字符串,而值为 nil,则意味着发生了意外情况,并且引发异常是适当的。如果这里 nil 的存在是意外的,那么使用 `to_s` 会隐藏问题并增加源代码和问题检测之间的距离,从而使调试变得更加困难。 (3认同)

Cli*_*chl 83

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

'aBcDe' =~ /bcd/i  # evaluates as true
Run Code Online (Sandbox Code Playgroud)

这也适用于多行字符串.

请参阅Ruby的Regexp类.

  • 如果要匹配用户输入并使用此技术,请记住在字符串上使用`Regexp.escape`.对于大多数用例,`s​​ome_str.include?substr.downcase()`应该更快,更易读. (10认同)
  • 使用正则表达式这种方式不一定比使用''aBcDe'.downcase.include?('bcd')`更快.正则表达式有其目的,但在内置方法更快时不使用它们.对正在测试的实际数据进行基准测试可以发现很多. (3认同)
  • !!('aBcDe' =~ /bcd/i) 将评估为真或假。使用 !!成语 (3认同)
  • 或者,使用匹配?返回布尔值: `/bcd/i.match?('aBcDe')` (3认同)
  • 这不评估为真.它评估为1,这是不正确的. (2认同)

Oto*_*lez 41

你也可以这样做......

my_string = "Hello world"

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

# => 'It has "Hello"'
Run Code Online (Sandbox Code Playgroud)

  • @luissimo `include?` 不会分割字符串。它只是检查一个字符串是否在另一个字符串中。``你好世界!你好吗?'.include?('e y') #=> true` 这个答案做了同样的事情。``你好世界!How are you?'['e y'] #=> "e y"` (这是 true),如果没有匹配则返回 `nil` (这是 false)。 (4认同)
  • 这是我以前从未见过的一个巧妙的技巧.但是`#include?`仍然快一点. (2认同)
  • 当您使用内部带有空格的句子时,`#include?`不起作用,因为`#include`将句子拆分为单词,然后将单词用作单独的数组值。这非常适合句子。+1 (2认同)

aci*_*708 30

扩展Clint Pachl的答案:

当表达式不匹配时,Ruby中的正则表达式匹配返回nil.如果是,则返回匹配发生的字符的索引.例如

"foobar" =~ /bar/  # returns 3
"foobar" =~ /foo/  # returns 0
"foobar" =~ /zzz/  # returns nil
Run Code Online (Sandbox Code Playgroud)

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

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

if "string" =~ /regex/
Run Code Online (Sandbox Code Playgroud)

按预期工作.如果匹配发生,则仅输入if块的"true"部分.


stw*_*667 19

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
Run Code Online (Sandbox Code Playgroud)

我也认为它更具可读性.

cf http://apidock.com/rails/v3.1.0/Object/in%3F

(请注意,它仅在Rails中可用,而不是纯Ruby.)

  • 没错,尽管由于很大一部分 Ruby 开发人员都在使用 Rails,我认为这可能是某些人的首选解决方案,因为它的清晰和简洁。 (3认同)
  • 这依赖于rails,OP要求提供ruby解决方案 (2认同)

Mau*_*uro 16

三元方式

my_string.include?('ahr') ? (puts 'String includes ahr') : (puts 'String does not include ahr')
Run Code Online (Sandbox Code Playgroud)

要么

puts (my_string.include?('ahr') ? 'String includes ahr' : 'String not includes ahr')
Run Code Online (Sandbox Code Playgroud)


daw*_*awg 10

您可以使用String Element Reference方法[]

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

> s='abcdefg'
=> "abcdefg"
> s['a']
=> "a"
> s['z']
=> nil
Run Code Online (Sandbox Code Playgroud)

因为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" 
Run Code Online (Sandbox Code Playgroud)

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

> '123456790'[8]    # integer is eighth element, or '0'
=> "0"              # would test as 'true' in Ruby
> '123456790'['8']  
=> nil              # correct
Run Code Online (Sandbox Code Playgroud)

你也可以使用正则表达式:

> s[/A/i]
=> "a"
> s[/A/]
=> nil
Run Code Online (Sandbox Code Playgroud)

  • 这是非凡的 (2认同)