# Splitting string to hash

**URL:** <https://www.ruby-forum.com/t/splitting-string-to-hash/67097>\
**Category:** Ruby\
**Created:** [August 31, 2006, 4:38pm UTC](https://www.ruby-forum.com/t/splitting-string-to-hash/67097 "2006-08-31T16:38:07Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![bcnice99](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@bcnice99](https://www.ruby-forum.com/u/bcnice99)\
**Post date:** [August 31, 2006, 4:38pm UTC](https://www.ruby-forum.com/t/splitting-string-to-hash/67097/1 "2006-08-31T16:38:07Z")

</div>

I have a strings like the following:  
s1- “[1] Hello [2] bye”  
s2- “[1] Hello [2] bye [2:1] continue [2] more”

I want to convert them to hashes like  
h1- {1 =\> “Hello”, 2 =\> “bye”}  
h2- {1 =\> “Hello”, 2 =\> “bye”, “2:1” =\> “continue”, “2:2” =\> more"}

Is there an easy Ruby way to do this?  
Thanks for the help  
Brian

---

<div class="post-metadata">

**Author:** ![bcnice99](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@bcnice99](https://www.ruby-forum.com/u/bcnice99)\
**Post date:** [August 31, 2006, 4:50pm UTC](https://www.ruby-forum.com/t/splitting-string-to-hash/67097/2 "2006-08-31T16:50:13Z")

</div>

On Aug 31, 2006, at 9:38 AM, Brian N. wrote:

> s2- “[1] Hello [2] bye [2:1] continue [2] more”

> h2- {1 =\> “Hello”, 2 =\> “bye”, “2:1” =\> “continue”, “2:2” =\> more"}

I assume more is missing a quote there.

Also, how was the 2:2 key determined?

James Edward G. II

---

<div class="post-metadata">

**Author:** ![bcnice99](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@bcnice99](https://www.ruby-forum.com/u/bcnice99)\
**Post date:** [August 31, 2006, 5:20pm UTC](https://www.ruby-forum.com/t/splitting-string-to-hash/67097/3 "2006-08-31T17:20:15Z")

</div>

Brian N. wrote:

> I have a strings like the following:  
> s1- “[1] Hello [2] bye”  
> s2- “[1] Hello [2] bye [2:1] continue [2] more”
> 
> I want to convert them to hashes like  
> h1- {1 =\> “Hello”, 2 =\> “bye”}  
> h2- {1 =\> “Hello”, 2 =\> “bye”, “2:1” =\> “continue”, “2:2” =\> more"}
> 
> Is there an easy Ruby way to do this?  
> Thanks for the help  
> Brian

Assuming that James is correct in that :2 is missing from the second  
string, this works:

h2 = Hash[\*s2.scan(/[([^[]]+)] (\w+)/).flatten]

(I’m starting to really like Ruby.)

In case that’s not clear, scan uses a regex to provide an array of  
2-element arrays from the text. Then flatten makes it into a single  
array, then the \* turns it into a list of just values, instead of an  
array. Then Hash[] turns each 2 values into a hash.

---

<div class="post-metadata">

**Author:** ![bcnice99](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@bcnice99](https://www.ruby-forum.com/u/bcnice99)\
**Post date:** [August 31, 2006, 8:48pm UTC](https://www.ruby-forum.com/t/splitting-string-to-hash/67097/4 "2006-08-31T20:48:57Z")

</div>

William C. wrote:

> Brian N. wrote:
> 
> > I have a strings like the following:  
> > s1- “[1] Hello [2] bye”  
> > s2- “[1] Hello [2] bye [2:1] continue [2] more”
> > 
> > I want to convert them to hashes like  
> > h1- {1 =\> “Hello”, 2 =\> “bye”}  
> > h2- {1 =\> “Hello”, 2 =\> “bye”, “2:1” =\> “continue”, “2:2” =\> more"}
> > 
> > Is there an easy Ruby way to do this?  
> > Thanks for the help  
> > Brian
> 
> Assuming that James is correct in that :2 is missing from the second  
> string, this works:
> 
> h2 = Hash[\*s2.scan(/[([^[]]+)] (\w+)/).flatten]
> 
> (I’m starting to really like Ruby.)
> 
> In case that’s not clear, scan uses a regex to provide an array of  
> 2-element arrays from the text. Then flatten makes it into a single  
> array, then the \* turns it into a list of just values, instead of an  
> array. Then Hash[] turns each 2 values into a hash.

Actually the original was correct - the second 2 should have a key of  
2:2 even though it only appears in the original string as 2 (since it  
follows a 2:1, it is assumed that any number after it would be 2:x. If  
there was a 3:1 sometime later, then the next two would have a key of  
3:2)

s2- “[1] Hello [2] bye [2:1] continue [2] more”

Thanks for the help  
Brian

---

<div class="post-metadata">

**Author:** ![bcnice99](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@bcnice99](https://www.ruby-forum.com/u/bcnice99)\
**Post date:** [September 6, 2006, 4:42pm UTC](https://www.ruby-forum.com/t/splitting-string-to-hash/67097/5 "2006-09-06T16:42:13Z")

</div>

On 8/31/06, Brian N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> I have a strings like the following:  
> s1- “[1] Hello [2] bye”  
> s2- “[1] Hello [2] bye [2:1] continue [2] more”
> 
> I want to convert them to hashes like  
> h1- {1 =\> “Hello”, 2 =\> “bye”}  
> h2- {1 =\> “Hello”, 2 =\> “bye”, “2:1” =\> “continue”, “2:2” =\> more"}
> 
> Is there an easy Ruby way to do this?

Brian-

Your problem is somewhat underspecified; with more examples and info,  
someone might be able to help better. Some important questions:

- may the phrases include spaces?
- can there be more than two levels?
- in your examples above, must the frist key be 1, or could it also be  
“1”? Or perhaps “1:0”?
- perhaps some more background on the use case would help as well.

Good luck!

-Alex
