我正在尝试计算一个字符串在另一个字符串中出现的次数。
我知道你可以数出一个字母在字符串中出现的次数:
string = "aabbccddbb"
string.count('a')
=> 2
但是如果我搜索 'aa' 在这个字符串中出现了多少次,我也会得到两次。
string.count('aa')
=> 2
我不明白这个。我将值放在引号中,因此我搜索的是确切字符串出现的次数,而不仅仅是字母。
最佳答案
这里有几种方法可以计算给定子字符串在字符串中出现的次数(第一种是我的偏好)。请注意(经 OP 确认)子字符串 'aa'
在字符串 'aaa'
中出现两次,因此出现了五次:
str = "aaabbccaaaaddbab"
#1
使用String#scan使用包含查找子字符串的正前瞻性的正则表达式:
def count_em(str, substr)
str.scan(/(?=#{substr})/).count
end
count_em(str,"aa")
#=> 5
count_em(str,"ab")
#=> 2
注意:
"aaabbccaaaaddbab".scan(/(?=aa)/)
#=> ["", "", "", "", ""]
积极的回顾会产生相同的结果:
"aaabbccaaaaddbab".scan(/(?<=aa)/)
#=> ["", "", "", "", ""]
同样,String#scan
可以替换为 String#gsub 的形式它接受一个参数(这里是相同的正则表达式)并且没有 block ,并返回一个枚举器。 gsub
的不寻常之处在于它与字符替换无关;它只是生成正则表达式的匹配项。
#2
转换为数组,应用String#each_char然后 Enumerable#each_cons , 然后 Enumerable#count :
def count_em(str, substr)
subarr = substr.chars
str.each_char
.each_cons(substr.size)
.count(subarr)
end
count_em(str,"aa")
#=> 5
count_em(str,"ab")
#=> 2
我们有:
subarr = "aa".chars
#=> ["a", "a"]
enum0 = "aaabbccaaaaddbab".each_char
#=> #<Enumerator: "aaabbccaaaaddbab":each_char>
我们可以通过将此枚举器转换为数组来查看将生成的元素:
enum0.to_a
#=> ["a", "a", "a", "b", "b", "c", "c", "a", "a", "a",
# "a", "d", "d", "b", "a", "b"]
enum1 = enum0.each_cons("aa".size)
#=> #<Enumerator: #<Enumerator:
# "aaabbccaaaaddbab":each_char>:each_cons(2)>
将 enum1
转换为数组以查看枚举器将传递给 map
的值:
enum1.to_a
#=> [["a", "a"], ["a", "a"], ["a", "b"], ["b", "b"], ["b", "c"],
# ["c", "c"], ["c", "a"], ["a", "a"], ["a", "a"], ["a", "a"],
# ["a", "d"], ["d", "d"], ["d", "b"], ["b", "a"],
# ["a", "b"]]
enum1.count(subarr)
#=> enum1.count(["a", "a"])
#=> 5
关于Ruby:如何计算一个字符串在另一个字符串中出现的次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25938430/