Рубиновая строка, повторяющаяся символами или пробелом - PullRequest
13 голосов
/ 15 февраля 2012

Как мне разбить эту строку.

"6885558 8866887777" => ["6", "88", "555", "8", "88", "66", "88", "7777"] 

Я пробовал это, но это никогда не работало.

ruby-1.8.7-p334 :020 > "111133".split(/(\d)\1+/)
 => ["", "1", "", "3"] 

1 Ответ

28 голосов
/ 15 февраля 2012

split будет просто использовать все, что совпадает, в качестве разделителя, удаляя его из рассматриваемой строки.То, что вы ищете, это scan:

str = "6885558 8866887777"
str.scan(/((\d)\2*)/).map(&:first)
# => ["6", "88", "555", "8", "88", "66", "88", "7777"]

Если говорить медленно, \d соответствует любой цифре.Он находится во второй группе захвата, поэтому \2* затем сопоставляет любые дальнейшие вхождения той же цифры.Это создает массив, который выглядит как

[["6", "6"], ["88", "8"], ["555", "5"], ["8", "8"],
 ["88", "8"], ["66", "6"], ["88", "8"], ["7777", "7"]]

Поскольку нам нужен только первый элемент в каждом из этих подмассивов, мы можем собрать их все с помощью map(&:first).

(обратите внимание, что str.scan(/(\d)\1*/) просто создаст массив из первой группы захвата, что означает, что мы получим только одну цифру из последовательности, возможно, повторяющихся чисел.)

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