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

Posted

技术标签:

【中文标题】如何检查字符串是不是包含Ruby中的子字符串【英文标题】:How to check whether a string contains a substring in Ruby如何检查字符串是否包含Ruby中的子字符串 【发布时间】:2012-01-05 17:00:45 【问题描述】:

我有一个包含内容的字符串变量:

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"

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

【问题讨论】:

相关问题:***.com/questions/3876246/… 请参阅***.com/a/3878656/128421,了解执行此操作的各种方法。 【参考方案1】:

你可以使用include?方法:

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

【讨论】:

记住include? 是区分大小写的。因此,如果上面示例中的my_string 类似于"abcDefg"(带有大写D),则include?("cde") 将返回false。在调用include?() 之前,您可能需要先发送downcase() 单独包含并不理想,因为如果 nil test = nil test.include?("test") NoMethodError: undefined method `include?' 它会抛出 NoMethodError对于 nil:NilClass 应始终将包含的值转换为预期值:- test.to_s.include?("test") @Gary 的建议认为如果您的目标是尽量减少这部分代码中引发的异常。这并不总是最好的目标。通常,如果您希望在代码中此时出现一个字符串,而一个值为 nil,则表示发生了意外情况并且引发了异常是适当的。如果这里出现了一个 nil 是意料之外的,使用to_s 会隐藏问题并增加源与问题检测之间的距离,使得调试变得更加困难。【参考方案2】:

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

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

这也适用于多行字符串。

有关详细信息,请参阅 Ruby 的 Regexp 类。

【讨论】:

如果您要匹配用户输入并使用此技术,请记住在字符串上使用Regexp.escape。对于大多数用例,some_str.include? substr.downcase() 应该工作得更快并且更具可读性。 以这种方式使用正则表达式不一定比使用'aBcDe'.downcase.include?('bcd') 更快。正则表达式有其用途,但当内置方法更快时不要使用它们。用正在测试的实际数据进行基准测试可以揭示很多。 这不评估为真。它的计算结果为 1,这是不正确的。 !!('aBcDe' =~ /bcd/i) 将评估为真或假。使用 !!成语 或者,使用匹配?返回一个布尔值:/bcd/i.match?('aBcDe')【参考方案3】:

你也可以这样做...

my_string = "Hello world"

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

# => 'It has "Hello"'

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

【讨论】:

这是一个我从未见过的巧妙技巧。但是#include? 还是快了一点。 #include? 在处理带有空格的句子时不起作用,因为#include 将句子拆分为单词,然后将单词用作单独的数组值。这非常适合句子。 +1 查看 Ruby 的 String [] 方法了解更多信息。 @luissimo include? 不会拆分字符串。它只是检查一个字符串是否在另一个字符串中。 'Hello World! How are you?'.include?('e y') #=> true 这个答案做同样的事情。 'Hello World! How are you?'['e y'] #=> "e y"(为真),如果没有匹配则返回nil(为假)。【参考方案4】:

扩展 Clint Pachl 的回答:

当表达式不匹配时,Ruby 中的正则表达式匹配返回 nil。当它这样做时,它返回匹配发生的字符的索引。例如:

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

请务必注意,在 Ruby 中,只有 nil 和布尔表达式 false 的计算结果为 false。其他所有内容,包括空 Array、空 Hash 或整数 0,都计算为 true。

这就是上面的 /foo/ 示例有效的原因,以及原因。

if "string" =~ /regex/

按预期工作,仅在发生匹配时输入 if 块的“真实”部分。

【讨论】:

if( ("foobar" =~ /foo/) == nil ) puts 'Not Found' else puts 'Found' end 它应该可以工作。【参考方案5】:

比 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。

【讨论】:

这依赖于 Rails,OP 要求提供 ruby​​ 解决方案 是的,尽管由于很大一部分 Ruby 开发人员都在使用 Rails,但我认为这可能是某些人的首选解决方案,因为它清晰简洁。 见***.com/a/4239625/128421。它在 Rails 中,但可以使用 Rails 的 Active Support Core Extensions 从常规 Ruby 轻松访问,这允许轻松挑选小组方法,例如仅 in? 正确@theTinMan。纯 Ruby 中的 "cde".in? my_string 产生 NoMethodError。但是使用require 'active_support/core_ext/object/inclusion' 它可以工作,可以从Rails 本身或从缩减的Active Support Core Extensions 加载。【参考方案6】:

三元方式

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

【讨论】:

【参考方案7】:

您可以使用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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:
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中的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是不是包含 JavaScript 中的子字符串?

如何检查字符串是不是包含 JavaScript 中的子字符串?

如何检查字符串是不是包含 JavaScript 中的子字符串?

如何检查一个对象是不是至少包含一个键,其值包含 JavaScript 中的子字符串?

如何检查字符串是不是具有列表中的子字符串?

使用存储过程检查字符串是不是包含 SQL Server 2005 中的子字符串