Вот несколько способов, чтобы сосчитать число раз данная подстрока появляется в строке (первый из которых мое предпочтение). Примечание (как это было подтверждено OP) подстроку 'aa'
появляется дважды в строке 'aaa'
, и, следовательно, пять раз:
string="aaabbccaaaaddbb"
# 1
Использование String#scan с регулярным выражением, которое содержит положительный предпросмотр, что ищет подстроки:
def count_em(string, substring)
string.scan(/(?=#{substring})/).count
end
count_em(string,"aa")
#=> 5
Примечание:
"aaabbccaaaaddbb".scan(/(?=aa)/)
#=> ["", "", "", "", ""]
Положительный просмотра назад приводит к тому же результату:
"aaabbccaaaaddbb".scan(/(?<=aa)/)
#=> ["", "", "", "", ""]
# 2
Преобразовать в массив, применять Enumerable#each_cons, а затем присоединиться и посчитайте:
def count_em(string, substring)
string.each_char.each_cons(substring.size).map(&:join).count(substring)
end
count_em(string,"aa")
#=> 5
Мы имеем:
enum0 = "aaabbccaaaaddbb".each_char
#=> #<Enumerator: "aaabbccaaaaddbb":each_char>
Мы можем увидеть элементы, которые генерируются этим интервьюером путем преобразования его в массив:
enum0.to_a
#=> ["a", "a", "a", "b", "b", "c", "c", "a", "a", "a",
# "a", "d", "d", "b", "b"]
enum1 = enum0.each_cons("aa".size)
#=> #<Enumerator: #<Enumerator: "aaabbccaaaaddbb":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", "b"]]
c = enum1.map(&:join)
#=> ["aa", "aa", "ab", "bb", "bc", "cc", "ca",
# "aa", "aa", "aa", "ad", "dd", "db", "bb"]
c.count("aa")
#=> 5
Просьба уточнить (с правлением): '' aa'' появляется один или два раза в строке ''aaa''. –
В этом случае, вероятно, должно быть два раза.Позиции 0 и 1 && Позиции 1 и 2 – Johnson
Конечно, вы отличный плакат. Я вознаградил тебя, Кэри Шарлотта. – Johnson