我正在尝试计算字符串出现在另一个字符串中的次数。
我知道你可以计算一个字母出现在字符串中的次数:
string = "aabbccddbb"
string.count('a')
=> 2
但如果我搜索“aa”出现在这个字符串中的次数,我也会得到两次。
string.count('aa')
=> 2
我不明白这一点。我把值放在引号中,所以我正在搜索确切字符串出现的次数,而不仅仅是字母。
答案 0 :(得分:49)
这里有几种方法来计算给定子字符串出现在字符串中的次数(第一个是我的偏好)。注意(由OP确认)子字符串'aa'
在字符串'aaa'
中出现两次,因此五次出现:
string="aaabbccaaaaddbb"
<强>#1 强>
将String#scan与包含寻找子字符串的正向前瞻的正则表达式一起使用:
def count_em(string, substring)
string.scan(/(?=#{substring})/).count
end
count_em(string,"aa")
#=> 5
注意:
"aaabbccaaaaddbb".scan(/(?=aa)/)
#=> ["", "", "", "", ""]
正面的后视产生相同的结果:
"aaabbccaaaaddbb".scan(/(?<=aa)/)
#=> ["", "", "", "", ""]
同样,String#scan
可以替换为String#gsub。
<强>#2 强>
转换为数组,应用Enumerable#each_cons,然后加入并计算:
def count_em(string, substring)
string.each_char.each_cons(substring.size).map(&:join).count(substring)
end
count_em(string,"aa")
#=> 5
我们有:
enum0 = "aaabbccaaaaddbb".each_char
#=> #<Enumerator: "aaabbccaaaaddbb":each_char>
我们可以看到这个枚举器通过将它转换为数组而生成的元素:
enum0.to_a
#=> ["a", "a", "a", "b", "b", "c", "c", "a", "a", "a",
# "a", "d", "d", "b", "b"]
enum1 = enum0.each_cons("aa".size)
#=> #<Enumerator: #<Enumerator: "aaabbccaaaaddbb":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", "b"]]
c = enum1.map(&:join)
#=> ["aa", "aa", "ab", "bb", "bc", "cc", "ca",
# "aa", "aa", "aa", "ad", "dd", "db", "bb"]
c.count("aa")
#=> 5
答案 1 :(得分:24)
这是因为count
计算了个字符,而不是字符串的实例。在这种情况下,'aa'
与'a'
的含义相同,它被认为是一组要计算的字符。
计算字符串中aa
出现的次数:
string = "aabbccddbb"
string.scan(/aa/).length
# => 1
string.scan(/bb/).length
# => 2
string.scan(/ff/).length
# => 0
答案 2 :(得分:-3)
尝试使用 string.split('a')。count-1