[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Splitting string into array keeping delimiters

Gary C40

12/15/2007 3:17:00 PM

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
--
Posted via http://www.ruby-....

6 Answers

Sebastian Hungerecker

12/15/2007 3:40:00 PM

0

Gary C40 wrote:
> 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
--
Jabber: sepp2k@jabber.org
ICQ: 205544826

Xavier Noria

12/15/2007 3:47:00 PM

0

On Dec 15, 2007, at 4:39 PM, Sebastian Hungerecker wrote:

> Gary C40 wrote:
>> 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


Phrogz

12/15/2007 4:53:00 PM

0

On Dec 15, 8:47 am, Xavier Noria <f...@hashref.com> wrote:
> On Dec 15, 2007, at 4:39 PM, Sebastian Hungerecker wrote:
>
>
>
> > Gary C40 wrote:
> >> 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"]

Clifford Heath

12/15/2007 11:57:00 PM

0

Phrogz wrote:
> On Dec 15, 8:47 am, Xavier Noria <f...@hashref.com> wrote:
> And another, from 1.9:

Yet another, after "gem install facets" and require "facets/string":

'abcd1234abc123'.shatter(/\d+/)

Gary C40

12/16/2007 5:05:00 AM

0

Wow, there sure are more than one way to solve a problem in Ruby.
Thanks for your help, I'll try them out ;)
--
Posted via http://www.ruby-....

MonkeeSage

12/16/2007 10:47:00 AM

0

On Dec 15, 9:16 am, Gary C40 <gary...@garyc40.com> wrote:
> 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
> --
> Posted viahttp://www.ruby-....

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