Ruby: Как я могу разбить строку, содержащую группы последовательных букв на группы этих букв? - PullRequest
1 голос
/ 04 апреля 2019

Я хочу превратить строку, содержащую группы последовательных букв:

"aaabbbcccaaa"

В

["aaa","bbb","ccc","aaa"]

Я уверен, что это должно быть прямо в Ruby, но я в тупике.

Ответы [ 5 ]

4 голосов
/ 04 апреля 2019
str = "aaabbbcccaaa"

str.gsub(/(.)\1*/).to_a
  #=> ["aaa", "bbb", "ccc", "aaa"]

Используется форма String # gsub , которая не имеет блока и поэтому возвращает перечислитель.

0 голосов
/ 04 апреля 2019

Я нашел способ сделать это без регулярного выражения, используя Array#slice_when:

"AAAABBBCDDD".chars.slice_when(&:!=).map(&:join)
#=> ["AAAA", "BBB", "C", "DDD"]

Хотя gsub с регулярным выражением (как предложил Кэри Свовеланд в своем ответе) явно быстрее:

Benchmark.measure do
  100_000.times { "AAAABBBCDDD".chars.slice_when(&:!=).map(&:join) }  
end  

# => #<Benchmark::Tms:0x00007fb11ff9a560
#  @cstime=0.0,
#  @cutime=0.0,
#  @label="",
#  @real=1.427345999982208,
#  @stime=0.013876,
#  @total=1.3629069999999996,
#  @utime=1.3490309999999996>

Benchmark.measure do
  100_000.times { "AAAABBBCDDD".gsub(/(.)(\1)*/).to_a }
end

=> #<Benchmark::Tms:0x00007fb1214f4dc0
#  @cstime=0.0,
#  @cutime=0.0,
#  @label="",
#  @real=0.6837240000022575,
#  @stime=0.03575100000000003,
#  @total=0.64306,
#  @utime=0.6073089999999999>
0 голосов
/ 04 апреля 2019

Глупая версия без регулярных выражений:

str = "aaabbbcccaaa"
str.each_char.with_object([]) { |a,r| (r.last&.end_with?(a) ? r.last : r) << a }
=> ["aaa", "bbb", "ccc", "aaa"]
0 голосов
/ 04 апреля 2019

Этот вариант должен работать для любой строки с группами из 2 последовательных символов

"foo\n\nbarr".gsub(/(.)(\1)*/).select{|l| l.length >1}
#=> ["oo", "rr"]

Или только для буквенных символов:

"foo\n\n??barr..bazz".gsub(/([a-zA-Z])(\1)*/).select{|l| l.length >1}
#=> ["oo", "rr", "zz"]
0 голосов
/ 04 апреля 2019

Модифицированный вариант ответа @ Phrogz

"aaabbbcccaaa".scan(/((.)\2*)/).map(&:first) # => ["aaa", "bbb", "ccc", "aaa"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...