A simple command that splits up a string into numbers and letters


#1

Hey all,

i am looking for an easy way to split a string into letters and numbers.
so if i had a string ‘34JKBY103’ i could get [‘34’, ‘JKBY’, ‘103’]

I could write up something, but thought that if there was already
something
out there that i hav’nt found, it would probably be cleaner.
thanks

sk


#2

On Feb 5, 2009, at 12:39 AM, shawn bright wrote:

sk

irb> ‘34JKBY103’.scan(/\d+|\D+/)
=> [“34”, “JKBY”, “103”]

that looks like an easy way :wink:

-Rob

Rob B. http://agileconsultingllc.com
removed_email_address@domain.invalid


#3

shawn bright wrote:

thanks

sk

I don’t know if there’s anything out there now (there might be), but it
seems pretty simple. Just split on either \d+ or \D+, depending
(unless I’m missing something in your requirement)?


#4

I got it on the first try with this split!

irb> ‘34JKBY103dfd878dsf78s78s’.split(/([a-zA-Z]+)(?=[0-9])/)
=> [“34”, “JKBY”, “103”, “dfd”, “878”, “dsf”, “78”, “s”, “78s”]

the first set of parens is capturing while the second set of parents is
a zero width positive look ahead


#5

sorry, how do i split on a \d+ ?
sk


#6

This is pretty close to what you want except for the first null

‘34JKBY103dfd878dsf78s78s’.split(/(\d+)/)
=> ["", “34”, “JKBY”, “103”, “dfd”, “878”, “dsf”, “78”, “s”, “78”, “s”]


#7

Tim G. wrote:

something out there that i hav’nt found, it would probably be
Someone posted this already, but:

irb(main):010:0> s = “34JKBY103”
=> “34JKBY103”
irb(main):011:0> s.scan(/\d+|\D+/)
=> [“34”, “JKBY”, “103”]
irb(main):012:0>

Also, remember, there are several ways to do this. You can use an
actual split() function with a regular expression.

See: http://www.ruby-doc.org/core/classes/String.html


#8

shawn bright wrote:

[post.]

sk

I don’t know if there’s anything out there now (there might be), but
it
seems pretty simple. Just split on either \d+ or \D+, depending
(unless I’m missing something in your requirement)?
<please don’t quote signatures>

Someone posted this already, but:

irb(main):010:0> s = “34JKBY103”
=> “34JKBY103”
irb(main):011:0> s.scan(/\d+|\D+/)
=> [“34”, “JKBY”, “103”]
irb(main):012:0>


#9

way cool, thanks, all
-sk


#10

I sort of got hung up on doing this with split. Using scan might be
easier than split. However it is worth noting that when you are
splitting on a pattern you can keep what the pattern matches in the
results array by capturing with a set of ()s. Compare these two
statements:

irb> ‘a,b,c’.split(/(,)/)
=> [“a”, “,”, “b”, “,”, “c”]

irb> ‘a,b,c’.split(/,/)
=> [“a”, “b”, “c”]