ChatGPT解决这个技术问题 Extra ChatGPT

如何检查字符串是否包含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"

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

有关执行此操作的各种方法的细分,请参阅 stackoverflow.com/a/3878656/128421

D
Dave Powers

您可以使用 include? 方法:

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

请记住,include? 是区分大小写的。因此,如果上面示例中的 my_string 类似于 "abcDefg"(带有大写 D),则 include?("cde") 将返回 false。您可能需要在调用 include?() 之前执行 downcase()
单独包含并不理想,因为它可以抛出 NoMethodError 如果 nil test = nil test.include?("test") NoMethodError: undefined method `include?'对于 nil:NilClass 应始终将包含的值转换为预期值:- test.to_s.include?("test")
@Gary 的建议认为 if 您的目标是尽量减少这部分代码中引发的异常。这并不总是最好的目标。通常,如果您希望在代码中此时出现一个字符串,而一个值为 nil,则表示发生了意外情况并且引发了异常是适当的。如果此处出现 nil 是意外的,使用 to_s 将隐藏问题并增加源与问题检测之间的距离,使其更难调试。
或者,避免使用安全导航运算符 test&.include?("test") 将方法发送到 nil
t
the Tin Man

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

'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')
O
Oto Brglez

你也可以这样做...

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(为假)。
t
the Tin Man

扩展 Clint Pachl 的回答:

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

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

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

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

if "string" =~ /regex/

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


if( ("foobar" =~ /foo/) == nil ) puts 'Not Found' else puts 'Found' end 它应该可以工作。
t
the Tin Man

比 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 开发人员都在使用 Rails,但我认为这可能是某些人的首选解决方案,因为它清晰简洁。
请参阅stackoverflow.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 加载。
B
BSMP

三元方式

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

d
dawg

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

S
Sagar Pandya

如何检查字符串是否包含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

P
Prabhakar Undurthi
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

d
d1jhoni1b

如果您不能使用上述库之一,则可以通过简单的文本搜索来实现相同的目的(由于 downcase 忽略了案例):

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