# A ruby-esque "split" that respects word groups

**URL:** <https://www.ruby-forum.com/t/a-ruby-esque-split-that-respects-word-groups/114628>\
**Category:** Ruby\
**Created:** [September 17, 2007, 1:23pm UTC](https://www.ruby-forum.com/t/a-ruby-esque-split-that-respects-word-groups/114628 "2007-09-17T13:23:19Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Kenosis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/f04885/32.png) [@Kenosis](https://www.ruby-forum.com/u/Kenosis)\
**Post date:** [September 17, 2007, 1:23pm UTC](https://www.ruby-forum.com/t/a-ruby-esque-split-that-respects-word-groups/114628/1 "2007-09-17T13:23:19Z")

</div>

Greetings friends,

I wondering if anyone here has some Ruby-fu they can share with WRT  
for following problem. I’ve toyed with this today and don’t like my  
solution so I thought I’d run it by y’all. In summary, suppose we  
have the following input, say to a command line interpreter:

foo bar “baz 42” “matz ruby yarv” jruby

Running split on this string, of course, yeilds:

[‘foo’, ‘bar’, ‘"baz’, ‘42"’, ‘"matz’, ‘ruby’, ‘yarv"’, ‘jruby’]

What I’d like instead is a “split” that respects the quoted word  
groupings, which would result in the following instead:

[‘foo’, ‘bar’, ‘baz 42’, ‘matz ruby yarv’, ‘jruby’]

Thanks in advance for any ideas you can lend!

Cheers,

Ken

---

<div class="post-metadata">

**Author:** ![Kenosis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/f04885/32.png) [@Kenosis](https://www.ruby-forum.com/u/Kenosis)\
**Post date:** [September 17, 2007, 1:23pm UTC](https://www.ruby-forum.com/t/a-ruby-esque-split-that-respects-word-groups/114628/2 "2007-09-17T13:23:27Z")

</div>

On Sep 13, 5:12 pm, Kenosis [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Ken

My cleanest solution thus far, which does not properly handled nested  
quotes:

a = “foo ‘bar baz bim’ 42 ‘java jruby jar’”  
puts a.split(“'”).each { |b| b.strip! }

---

<div class="post-metadata">

**Author:** ![Kenosis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/f04885/32.png) [@Kenosis](https://www.ruby-forum.com/u/Kenosis)\
**Post date:** [September 17, 2007, 1:25pm UTC](https://www.ruby-forum.com/t/a-ruby-esque-split-that-respects-word-groups/114628/3 "2007-09-17T13:25:01Z")

</div>

On Sep 13, 2007, at 7:15 PM, Kenosis wrote:

> What I’d like instead is a “split” that respects the quoted word  
> groupings, which would result in the following instead:
> 
> [‘foo’, ‘bar’, ‘baz 42’, ‘matz ruby yarv’, ‘jruby’]

> > require “shellwords”  
> > =\> true
> 
> > Shellwords.shellwords(%q{foo bar “baz 42” “matz ruby yarv” jruby})  
> > =\> [“foo”, “bar”, “baz 42”, “matz ruby yarv”, “jruby”]

Hope that helps.

James Edward G. II

---

<div class="post-metadata">

**Author:** ![Kenosis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/f04885/32.png) [@Kenosis](https://www.ruby-forum.com/u/Kenosis)\
**Post date:** [September 17, 2007, 1:25pm UTC](https://www.ruby-forum.com/t/a-ruby-esque-split-that-respects-word-groups/114628/4 "2007-09-17T13:25:12Z")

</div>

On 9/14/07, Kenosis [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Thanks in advance for any ideas you can lend!  
> Not sure if this is the best way, but just doing this off the cuff and  
> it  
> works:

scan(/\w+|".+?"/)

Regards,  
Peter C.

> **[Ruby Inside: The Ruby Blog](http://www.rubyinside.com/)**
>
> The biggest Ruby and Rails blog since 2006 - tutorials, news, and lots more

---

<div class="post-metadata">

**Author:** ![Kenosis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/f04885/32.png) [@Kenosis](https://www.ruby-forum.com/u/Kenosis)\
**Post date:** [September 25, 2007, 11:05pm UTC](https://www.ruby-forum.com/t/a-ruby-esque-split-that-respects-word-groups/114628/5 "2007-09-25T23:05:44Z")

</div>

On Sep 13, 5:45 pm, James Edward G. II [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> =\> [“foo”, “bar”, “baz 42”, “matz ruby yarv”, “jruby”]
> 
> Hope that helps.
> 
> James Edward G. II

Yes, Jame - that helps a lot 🙂

Best,

Ken
