我试图计算一个字符串出现在另一个字符串中的次数。
我知道你能数出字符串中出现字母的次数:
string = "aabbccddbb" string.count('a') => 2
但是如果我在这个字符串中搜索‘ aa’出现的次数,我也会得到两次。
string.count('aa') => 2
我不明白。我将值放在引号中,所以我搜索的是精确字符串出现的次数,而不仅仅是字母。
这是因为 count计算的是 角色,而不是字符串的实例。在这种情况下,'aa'的意思与 'a'相同,它被认为是一组需要计数的字符。
count
'aa'
'a'
要计算字符串中出现 aa的次数:
aa
string = "aabbccddbb" string.scan(/aa/).length # => 1 string.scan(/bb/).length # => 2 string.scan(/ff/).length # => 0
下面是计算给定子字符串在字符串中出现次数的几种方法(第一种是我的偏好)。注意(经 OP 证实)子字符串 'aa'在字符串 'aaa'中出现两次,因此在:
'aaa'
str = "aaabbccaaaaddbab"
# 1
将 字符串 # 扫描与包含查找子字符串的正则表达式一起使用,正则表达式包含正向前瞻:
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也可以替换为 字符串 # gsub的形式,它接受一个参数(这里是相同的正则表达式) ,不接受块,并返回一个枚举数。gsub的这种形式与众不同,因为它与字符替换没有任何关系; 它只是生成正则表达式的匹配。
String#scan
gsub
# 2
转换为一个数组,应用 字符串 # each _ char然后 可枚举的 # each _ con,然后 数不胜数:
def count_em(str, substr) subarr = substr.chars str.each_char .each_cons(substr.size) .count(subarr) end
我们有:
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
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
尝试使用 Split (‘ a’) . count-1