Forum: Ruby What's the best way to split this kind of string?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Sam K. (Guest)
on 2006-03-13 10:01
(Received via mailing list)
Hi!

I'm trying to make a routine to make a Morris Number Sequence.
(http://www.ocf.berkeley.edu/~stoll/number_sequence.html)
I need to split a string in the following way, for example.

"111223133" => ["111", "22", "3", "1", "33"]

I can loop thru the string by each character, comparing with the
previous character.
But is there a quick and easy way?
Probably a regular expression?

Thanks.

Sam
Jim W. (Guest)
on 2006-03-13 10:17
Sam K. wrote:
> Hi!
>
> I'm trying to make a routine to make a Morris Number Sequence.
> (http://www.ocf.berkeley.edu/~stoll/number_sequence.html)
> I need to split a string in the following way, for example.
>
> "111223133" => ["111", "22", "3", "1", "33"]
>
> I can loop thru the string by each character, comparing with the
> previous character.
> But is there a quick and easy way?
> Probably a regular expression?

This seems to work:

"111223133".scan(/1+|2+|3+|4+|5+|6+|7+|8+|9+|0+/)
=> ["111", "22", "3", "1", "33"]

--
-- Jim W.
Ross B. (Guest)
on 2006-03-13 10:25
(Received via mailing list)
On Mon, 2006-03-13 at 16:58 +0900, Sam K. wrote:
> But is there a quick and easy way?
> Probably a regular expression?

Maybe something like:

	s.scan(/(\d)(\1*)/).map! { |e| e.join }
	# => ["111", "22", "3", "1", "33"]

or:

	s.scan(/0+|1+|2+|3+|4+|5+|6+|7+|8+|9+/)
	# => ["111", "22", "3", "1", "33"]
William J. (Guest)
on 2006-03-13 12:00
(Received via mailing list)
Sam K. wrote:
> But is there a quick and easy way?
> Probably a regular expression?
>
> Thanks.
>
> Sam

"111223133".scan(/(.)(\1*)/).map{|x|x.join}
Thiago A. (Guest)
on 2006-03-13 13:22
(Received via mailing list)
On 3/13/06, Ross B. <removed_email_address@domain.invalid> wrote:
> Maybe something like:
>
>         s.scan(/(\d)(\1*)/).map! { |e| e.join }
>         # => ["111", "22", "3", "1", "33"]

Hmm.... Clever
Andrew J. (Guest)
on 2006-03-13 19:50
(Received via mailing list)
On Mon, 13 Mar 2006 17:23:56 +0900, Ross B.
<removed_email_address@domain.invalid>
wrote:
[snip]
> Maybe something like:
>
> 	s.scan(/(\d)(\1*)/).map! { |e| e.join }
> 	# => ["111", "22", "3", "1", "33"]
>
> or:
>
> 	s.scan(/0+|1+|2+|3+|4+|5+|6+|7+|8+|9+/)
> 	# => ["111", "22", "3", "1", "33"]

Or:

  s.scan(/((.)\2*)/).transpose[0]

Boy, are my fingers glad to save those keystrokes :-)

andrew
This topic is locked and can not be replied to.