2016-09-06 3 views
1

Я работаю над проблемой, когда мне присваивается «закодированное» сообщение в виде строки и нужно вернуть декодированное сообщение. Для этого требуется, чтобы я разделил строку смешанных символов и чисел в массив. Так, например, если я получил строку, как это:Ruby - Преобразование смешанной строки в массив

"0h" 

Я хочу, чтобы разделить его в массив, как это:

[0, "h"] 

Но когда я использую .split я получаю

["0", "h"] 

Решения, которые я нашел, учитывают только строки, все числа, но не смешанные строки. Есть ли способ преобразовать строки, которые являются числами в числа, сохраняя символы?

ответ

1

Если я правильно вас понимаю, вы хотите, чтобы цифры в строке заканчивались как Fixnums в вашем массиве.

Вы можете сделать это, добавив .map к вашему split:

... .map { |c| c =~ /\d/ ? c.to_i : c } 
4

Вы можете использовать String#scan с регулярным выражением.

str = "0hh1ghi22d" 

str.scan(/\d+|\D+/).map { |s| s =~ /\d+/ ? s.to_i : s } 
    #=> [0, "hh", 1, "ghi", 22, "d"] 

или

str.each_char.map { |s| s =~ /\d/ ? s.to_i : s } 
    #=> [0, "h", "h", 1, "g", "h", "i", 2, 2, "d"] 

в зависимости от требований.

+0

'chars', поскольку первая часть также работает, если требуются отдельные символы. – tadman

+0

@ tadman, хорошее предложение, поскольку на этом вопрос непонятен. Я сделал редактирование. –

+0

Вы можете избежать совпадения '\ d +' дважды с помощью групп захвата: 'str.scan (/ (\ D +) | (\ d +) /). Map {| s, d | s || d.to_i} '(обратите внимание, что я изменил порядок' \ D + 'и' \ d + ') – Stefan

Смежные вопросы