Как разбить строку, группируя последовательные одинаковые символы - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть строка последовательных одинаковых символов, например: «aaabbc», которую я хочу сгруппировать в массив: [«aaa», «bb», «c»].

IЯ уже пытался решить ее с помощью Hash, и это действительно сработало, но теперь мне интересно, можно ли решить с помощью split и regex.

Это то, что я сделал, основываясь на другом ответе SO:

"aaabbc".split(/\\b([a-z])\\1+\\b/)

Но это дает мне только начальную строку в массиве:

["aaabbc"] 

Вместо того, чтобы давать каждой группе одинаковые последовательные символы, разделенные запятыми:

["aaa", "bb", "c"]

Ответы [ 2 ]

7 голосов
/ 01 ноября 2019
"aaabbc".gsub(/(.)\1*/).to_a
  #=> ["aaa", "bb", "c"] 

Используется форма String # gsub , когда блок не задан, и в этом случае возвращается перечислитель. Фактически, эта форма gsub не имеет ничего общего с заменой строк;перечислитель просто генерирует совпадения. Он преодолевает ограничение String # scan , когда присутствуют группы захвата.

Регулярное выражение гласит: «соответствует любому символу, сохраняя его в группе захвата 1, затем сопоставляя ноль или более символов, равныхк содержанию группы захвата 1 ".

6 голосов
/ 01 ноября 2019

Этот ответ не использует split, но предлагает другую альтернативу. Вы можете использовать Enumerable#chunk_while:

"aaabbc".each_char.chunk_while(&:==).map(&:join)
#=> ["aaa", "bb", "c"]

. Сначала это разделяет строку в список символов, затем сравнивает последовательные элементы, используя ==. Это создает массив массивов символов. Наконец, вы конвертируете каждый массив символов обратно в строку, используя join.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...