如何检查字符串是不是包含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 中的子字符串?