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

x7yiwoj4  于 2023-01-16  发布在  Ruby
关注(0)|答案(3)|浏览(186)

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

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

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

string.count('aa')
=> 2

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

bkhjykvo

bkhjykvo1#

这里有两种方法来计算给定子字符串在字符串中出现的次数(第一种是我的首选),注意(OP确认)子字符串'aa'在字符串'aaa'中出现了两次,因此在中出现了五次:

str = "aaabbccaaaaddbab"
    • 1.将String #scan与包含查找给定子字符串的正前瞻的正则表达式一起使用**

x一个一个一个一个x一个一个二个x
注:

"aaabbccaaaaddbab".scan(/(?=aa)/)
  #=> ["", "", "", "", ""]

正向后查找会产生相同的结果:

"aaabbccaaaaddbab".scan(/(?<=aa)/)
  #=> ["", "", "", "", ""]

同样,String#scan也可以替换为String #gsub的形式,它只接受一个参数(这里是同一个正则表达式),不接受任何块,并返回一个枚举数,这种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
ddarikpa

ddarikpa2#

这是因为count计算的是 * 字符 *,而不是字符串的示例,在这种情况下,'aa''a'的意思是一样的,它被认为是一组要计算的字符。
要计算aa在字符串中出现的次数:

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

wlsrxk513#

尝试使用字符串.split('a').count - 1

相关问题