Splitting string into array keeping delimiters

G

Gary C40

Hi, I've been playing Ruby for a few months now.
Yesterday I came across an interesting problem.
If I have this string:
abcd1234abc123
Now I want to separate the digit group with the non-digit group into an
array like this ["abcd",1234,"abc",123]. It's like re.split in Python.
How can I do it in Ruby with the least lines of code possible?
'abcd1234abc123'.split(/\d+/) only returns ["abcd","abc"]
Thank you in advance
 
S

Sebastian Hungerecker

Gary said:
If I have this string:
abcd1234abc123
Now I want to separate the digit group with the non-digit group into an
array like this ["abcd",1234,"abc",123]. It's like re.split in Python.
How can I do it in Ruby with the least lines of code possible?
'abcd1234abc123'.split(/\d+/) only returns ["abcd","abc"]

If the regex has capturing groups you'll get those in the array as well.
'abcd1234abc123'.split(/(\d+)/) #=> ["abcd", "1234", "abc", "123"]

If you need the numbers as integers, you could use something like:
'abcd1234abc123'.scan(/(\D+)(\d+)?/).map {|nd,d| [nd,d.to_i]}
#=> [["abcd", 1234], ["abc", 123]]
(Maybe add flatten and compact)

or

res=[]
'abcd1234abc123'.scan(/(\D+)(\d+)?/) do
res << $1
res << $2.to_i if $2
end
res #=> ["abcd", 1234, "abc", 123]


HTH,
Sebastian
 
X

Xavier Noria

Gary said:
If I have this string:
abcd1234abc123
Now I want to separate the digit group with the non-digit group
into an
array like this ["abcd",1234,"abc",123]. It's like re.split in
Python.
How can I do it in Ruby with the least lines of code possible?
'abcd1234abc123'.split(/\d+/) only returns ["abcd","abc"]

If the regex has capturing groups you'll get those in the array as
well.
'abcd1234abc123'.split(/(\d+)/) #=> ["abcd", "1234", "abc", "123"]

If you need the numbers as integers, you could use something like:
'abcd1234abc123'.scan(/(\D+)(\d+)?/).map {|nd,d| [nd,d.to_i]}
#=> [["abcd", 1234], ["abc", 123]]
(Maybe add flatten and compact)

Just another one:

'abcd1234abc123'.scan(/\D+|\d+/) # ["abcd", "1234", "abc", "123"]

-- fxn
 
P

Phrogz

Gary said:
If I have this string:
abcd1234abc123
Now I want to separate the digit group with the non-digit group
into an
array like this ["abcd",1234,"abc",123]. It's like re.split in
Python.
How can I do it in Ruby with the least lines of code possible?
'abcd1234abc123'.split(/\d+/) only returns ["abcd","abc"]
If the regex has capturing groups you'll get those in the array as
well.
'abcd1234abc123'.split(/(\d+)/) #=> ["abcd", "1234", "abc", "123"]
If you need the numbers as integers, you could use something like:
'abcd1234abc123'.scan(/(\D+)(\d+)?/).map {|nd,d| [nd,d.to_i]}
#=> [["abcd", 1234], ["abc", 123]]
(Maybe add flatten and compact)

Just another one:

'abcd1234abc123'.scan(/\D+|\d+/) # ["abcd", "1234", "abc", "123"]

And another, from 1.9:

irb(main):004:0> str.split /(?<=\D)(?=\d)|(?<=\d)(?=\D)/
=> ["abcd", "1234", "abc", "123"]
 
G

Gary C40

Wow, there sure are more than one way to solve a problem in Ruby.
Thanks for your help, I'll try them out ;)
 
M

MonkeeSage

Hi, I've been playing Ruby for a few months now.
Yesterday I came across an interesting problem.
If I have this string:
abcd1234abc123
Now I want to separate the digit group with the non-digit group into an
array like this ["abcd",1234,"abc",123]. It's like re.split in Python.
How can I do it in Ruby with the least lines of code possible?
'abcd1234abc123'.split(/\d+/) only returns ["abcd","abc"]
Thank you in advance

And the highly esoteric version...

n = [[]]
s = [[]]
'abcd1234abc123'.each_byte { | x |
if (47..57).include?(x)
then s << []; n.last << x
else n << []; s.last << x
end
}
n = n.reject { | x | x.empty? }.map { | x |
x.map {| y | y.chr }.join("").to_i }
s = s.reject { | x | x.empty? }.map { | x |
x.map { | y | y.chr }.join("") }
result = if n.length > s.length
then n.zip(s).flatten.compact
else s.zip(n).flatten.compact
end
p result # => ["abcd", 1234, "abc", 123]

Regards,
Jordan
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,731
Messages
2,569,432
Members
44,835
Latest member
KetoRushACVBuy

Latest Threads

Top