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

标签 ruby string count

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

我知道你可以数出一个字母在字符串中出现的次数:

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

但是如果我搜索 'aa' 在这个字符串中出现了多少次,我也会得到两次。

string.count('aa')
=> 2

我不明白这个。我将值放在引号中,因此我搜索的是确切字符串出现的次数,而不仅仅是字母。

最佳答案

这里有几种方法可以计算给定子字符串在字符串中出现的次数(第一种是我的偏好)。请注意(经 OP 确认)子字符串 'aa' 在字符串 'aaa' 中出现两次,因此出现了五次:

str = "aaabbccaaaaddbab"

#1

使用String#scan使用包含查找子字符串的正前瞻性的正则表达式:

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 可以替换为 String#gsub 的形式它接受一个参数(这里是相同的正则表达式)并且没有 block ,并返回一个枚举器。 gsub 的不寻常之处在于它与字符替换无关;它只是生成正则表达式的匹配项。

#2

转换为数组,应用String#each_char然后 Enumerable#each_cons , 然后 Enumerable#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

我们有:

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

关于Ruby:如何计算一个字符串在另一个字符串中出现的次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25938430/

相关文章:

ruby-on-rails - thumbs_up gem 的缓存问题

ruby - 从不同位置运行 ruby​​ 文件时加载错误

java - 由于新行开始而导致的字符串格式问题

ruby-on-rails - 在 Rails 3 中使用 Scrapi .. 出现段错误/中止陷阱

ruby - ruby 1.8 上的 WEBrick 错误,在 ruby​​ 1.9 上工作正常

c - 打印字符串有困难

从文本中删除标点符号(符号 & 除外)

ruby-on-rails - Rails - 保存前计算属性

mysql 计算其他表的行数并在 where 中使用它

python - 计数为零时的 pandas groupby 以及如何在结果中包含零值