我在计算一个字符串在另一个字符串中出现的次数。我知道你可以计算一个字母在字符串中出现的次数:
string = "aabbccddbb" string.count('a') => 2
但是如果我搜索'aa'在这个字符串中出现了多少次,我也得到了两次。
string.count('aa') => 2
我不明白,我把值放在引号里,所以我搜索的是字符串出现的次数,而不仅仅是字母。
bkhjykvo1#
这里有两种方法来计算给定子字符串在字符串中出现的次数(第一种是我的首选),注意(OP确认)子字符串'aa'在字符串'aaa'中出现了两次,因此在中出现了五次:
'aa'
'aaa'
str = "aaabbccaaaaddbab"
x一个一个一个一个x一个一个二个x注:
"aaabbccaaaaddbab".scan(/(?=aa)/) #=> ["", "", "", "", ""]
正向后查找会产生相同的结果:
"aaabbccaaaaddbab".scan(/(?<=aa)/) #=> ["", "", "", "", ""]
同样,String#scan也可以替换为String #gsub的形式,它只接受一个参数(这里是同一个正则表达式),不接受任何块,并返回一个枚举数,这种gsub的形式不寻常之处在于它与字符替换无关;它只生成正则表达式的匹配项。
String#scan
gsub
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
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
ddarikpa2#
这是因为count计算的是 * 字符 *,而不是字符串的示例,在这种情况下,'aa'和'a'的意思是一样的,它被认为是一组要计算的字符。要计算aa在字符串中出现的次数:
count
'a'
aa
string = "aabbccddbb" string.scan(/aa/).length # => 1 string.scan(/bb/).length # => 2 string.scan(/ff/).length # => 0
wlsrxk513#
尝试使用字符串.split('a').count - 1
3条答案
按热度按时间bkhjykvo1#
这里有两种方法来计算给定子字符串在字符串中出现的次数(第一种是我的首选),注意(OP确认)子字符串
'aa'
在字符串'aaa'
中出现了两次,因此在中出现了五次:x一个一个一个一个x一个一个二个x
注:
正向后查找会产生相同的结果:
同样,
String#scan
也可以替换为String #gsub的形式,它只接受一个参数(这里是同一个正则表达式),不接受任何块,并返回一个枚举数,这种gsub
的形式不寻常之处在于它与字符替换无关;它只生成正则表达式的匹配项。我们有:
我们可以通过将枚举数转换为数组来查看它将生成的元素:
将
enum1
转换为数组,以查看枚举器将传递给map
的值:ddarikpa2#
这是因为
count
计算的是 * 字符 *,而不是字符串的示例,在这种情况下,'aa'
和'a'
的意思是一样的,它被认为是一组要计算的字符。要计算
aa
在字符串中出现的次数:wlsrxk513#
尝试使用字符串.split('a').count - 1