String#split
плохо подходит для этой проблемы по причинам, указанным другими.Я бы подошел к этому так, используя вместо этого String#scan
:
str_parts = "N8383".scan(/[[:alpha:]]+/)
num_parts = "N8383".scan(/[[:digit:]]+/)
Это даст вам возможность работать, если строки содержат несколько строковых частей и / или несколько числовых частей.
Это выражение:
%w[N344 344N S555 555S].map do |str|
next str.scan(/[[:alpha:]]+/), str.scan(/[[:digit:]]+/)
end
Вернет:
[
[["N"], ["344"]],
[["N"], ["344"]],
[["S"], ["555"]],
[["S"], ["555"]]
]
Хотя вы сканируете каждую строку дважды, я думаю, что это лучшее решение, чем 1. пытаться прийтисо сложным регулярным выражением, которое возвращает обратно, чтобы вернуть детали в правильном порядке, или 2. обрабатывает результаты, чтобы расположить детали в правильном порядке.Особенно, если строки такие короткие, как в приведенных вами примерах.При этом, если сканирование каждой строки дважды действительно раздражает вас, вот еще один способ сделать это:
str_parts, num_parts = str.scan(/([[:alpha:]]+)|([[:digit:]]+)/).transpose.each(&:compact!)