Ruby: 如何计算一个字符串在另一个字符串中出现的次数?

我试图计算一个字符串出现在另一个字符串中的次数。

我知道你能数出字符串中出现字母的次数:

string = "aabbccddbb"
string.count('a')
=> 2

但是如果我在这个字符串中搜索‘ aa’出现的次数,我也会得到两次。

string.count('aa')
=> 2

我不明白。我将值放在引号中,所以我搜索的是精确字符串出现的次数,而不仅仅是字母。

46069 次浏览

这是因为 count计算的是 角色,而不是字符串的实例。在这种情况下,'aa'的意思与 'a'相同,它被认为是一组需要计数的字符。

要计算字符串中出现 aa的次数:

string = "aabbccddbb"
string.scan(/aa/).length
# => 1
string.scan(/bb/).length
# => 2
string.scan(/ff/).length
# => 0

下面是计算给定子字符串在字符串中出现次数的几种方法(第一种是我的偏好)。注意(经 OP 证实)子字符串 'aa'在字符串 '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的这种形式与众不同,因为它与字符替换没有任何关系; 它只是生成正则表达式的匹配。

# 2

转换为一个数组,应用 字符串 # each _ char然后 可枚举的 # each _ con,然后 数不胜数:

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

尝试使用 Split (‘ a’) . count-1