我有一个包含内容的字符串变量:
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"
我怎样才能找到它?我需要确定子字符串是否存在。
您可以使用 include?
方法:
my_string = "abcdefg"
if my_string.include? "cde"
puts "String includes 'cde'"
end
如果大小写无关紧要,那么不区分大小写的正则表达式是一个很好的解决方案:
'aBcDe' =~ /bcd/i # evaluates as true
这也适用于多行字符串。
有关详细信息,请参阅 Ruby 的 Regexp 类。
Regexp.escape
。对于大多数用例,some_str.include? substr.downcase()
应该工作得更快并且更具可读性。
'aBcDe'.downcase.include?('bcd')
更快。正则表达式有其用途,但当内置方法更快时不要使用它们。用正在测试的实际数据进行基准测试可以揭示很多。
/bcd/i.match?('aBcDe')
你也可以这样做...
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
[]
方法。
include?
不拆分字符串。它只是检查一个字符串是否在另一个字符串中。 'Hello World! How are you?'.include?('e y') #=> true
这个答案做同样的事情。 'Hello World! How are you?'['e y'] #=> "e y"
(为真),如果没有匹配则返回 nil
(为假)。
扩展 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
它应该可以工作。
比 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。
in?
。
"cde".in? my_string
产生 NoMethodError
。但是使用 require 'active_support/core_ext/object/inclusion'
它可以工作,可以从 Rails 本身或从缩减的 Active Support Core Extensions 加载。
三元方式
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')
您可以使用 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
如何检查字符串是否包含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
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
如果您不能使用上述库之一,则可以通过简单的文本搜索来实现相同的目的(由于 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
不定期副业成功案例分享
include?
是区分大小写的。因此,如果上面示例中的my_string
类似于"abcDefg"
(带有大写D
),则include?("cde")
将返回false
。您可能需要在调用include?()
之前执行downcase()
。to_s
将隐藏问题并增加源与问题检测之间的距离,使其更难调试。test&.include?("test")
将方法发送到 nil