2017-02-06 2 views
1

Я использую Ruby 2.4. Есть ли способ, которым я могу разделить на регулярное выражение и получить результирующие элементы в массиве? Я думал, что это был путьКак мне разделить на регулярное выражение и получить мои элементы в массив?

2.4.0 :003 > word = "4.ARTHUR" 
=> "4.ARTHUR" 
2.4.0 :004 > word.split(/^\d+\./) 
=> ["", "ARTHUR"] 

но, как вы видите, первый элемент моего массива является пустой строкой, несмотря на то, что модель соответствует. Я хотел бы выход быть

["4.", "ARTHUR"] 
+0

Значит, вам нужно '4.' быть в массиве? Попробуйте 'word.split (/^(\ d + \.) /)' –

+0

Это определенно меня немного ближе. Теперь массив ["", "4.", "ARTHUR"]. Есть ли способ сделать это так, чтобы в нем присутствовали только два элемента? – Dave

+0

Удалите их: 'word.split (/^(\ d + \.) /). Reject {| c | c.empty? } ' –

ответ

0

Обратите внимание, что split разбивает строку, где найдено совпадение. Итак, ^\d+\. соответствует 4. в 4.ARTHUR в начале и, следовательно, результатом является пустая строка (начало строки) и ARTHUR. Чтобы сохранить матч, полученный в ходе split работы с регулярным выражением, вам нужно обернуть весь шаблон с захватом группой и избавиться от пустых элементов, вы можете просто удалить их позже:

word.split(/^(\d+\.)/).reject { |x| x.empty? } 
0

Почему бы просто не сделать

irb(main):004:0> word = "4.ARTHUR" 
=> "4.ARTHUR" 
irb(main):005:0> word.split('.') 
=> ["4", "ARTHUR"] 
0

Если вы хотите, чтобы разбить строку, но сохранить все его части, String#scan часто лучше подходит, чем String#split:

word = "4.ARTHUR" 
word.scan(/^\d+\.|.+/) 
# => ["4.", "ARTHUR"] 

Посмотреть по repl.it: https://repl.it/F90q

0

Попробуйте

a, b = word.match(/^(\d+\.)?(.*)/).captures 

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

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