这里有两种方法来计算给定子字符串在字符串中出现的次数(第一种是我的偏好)。注意(经OP确认)子字符串'aa'
在字符串中出现两次'aaa'
,因此五次:
str = "aaabbccaaaaddbab"
1. Use 字符串#scan http://www.ruby-doc.org/core-2.1.0/String.html#method-i-scan使用包含查找给定子字符串的正向前瞻的正则表达式
def count_em(str, substr)
str.scan(/(?=#{substr})/).count
end
count_em(str,"aa")
#=> 5
count_em(str,"ab")
#=> 2
Note:
"aaabbccaaaaddbab".scan(/(?=aa)/)
#=> ["", "", "", "", ""]
正向回顾会产生相同的结果:
"aaabbccaaaaddbab".scan(/(?<=aa)/)
#=> ["", "", "", "", ""]
还有,String#scan
可以替换为以下形式字符串#gsub http://ruby-doc.org/core-2.5.1/String.html#method-i-gsub它接受一个参数(这里是相同的正则表达式)并且没有块,并返回一个枚举器。那种形式的gsub
不寻常之处在于与角色替换无关;它只是生成正则表达式的匹配项。
2. 将给定字符串转换为字符数组,应用字符串#each_char https://ruby-doc.org/core-2.7.0/String.html#method-i-each_char then 可枚举#each_cons http://www.ruby-doc.org/core-2.1.1/Enumerable.html#method-i-each_cons, then 可枚举#count https://ruby-doc.org/core-2.7.0/Enumerable.html#method-i-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
We have:
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)>
Convert 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