bodikp
March 19, 2008, 8:53am
#1
I want to be able to split a string at the space, unless the spaces are
inside question marks. I’ve got a solution, but it makes baby Jesus cry:
http://pastebin.com/m6db29d1e
Any better ideas? Is there already a built-in method to do this (or even
one in ActiveSupport)?
bodikp
March 19, 2008, 10:03am
#2
On Wed, Mar 19, 2008 at 6:53 PM, Peter B. [email protected]
wrote:
I want to be able to split a string at the space, unless the spaces are
inside question marks. I’ve got a solution, but it makes baby Jesus cry:
string = ‘This is one solution “that uses a while loop” but I think
“someone can do it with map”’
quotes = []
while string =~ /".?"/
quotes << string.slice!(/". ?"/)
end
p quotes + string.split(’ ')
#=> ["“that uses a while loop”", ““someone can do it with map””,
“This”, “is”, “one”, “solution”, “but”, “I”, “think”]
Mikel
http://lindsaar.net/
bodikp
March 19, 2008, 10:10am
#3
From: Peter B. [mailto:[email protected] ]
I want to be able to split a string at the space, unless the
spaces are
inside question marks. I’ve got a solution, but it makes baby
^^^^^^^^^^^ i think you meant quotation marks, no?
Jesus cry:
that is one way and it does not look bad.
there are many ways, of course.
Any better ideas?
im not sure if this is better, but
irb(main):071:0> x
=> "this "this too " not this "these too " not these "
irb(main):072:0> x.split(/\s*?(".?")\s ?/).map{|x| x=~/^".*"$/ ? x :
x.split}.flatten
=> [“this”, ""this too “”, “not”, “this”, ""these too “”, “not”,
“these”]
Is there already a built-in method to do
this (or even one in ActiveSupport)?
i do not know of ActiveSupport in ruby. Are you talking about rails?
kind regards -botp
bodikp
March 19, 2008, 11:30am
#4
Peter B. wrote:
Is there already a built-in method to do this
require ‘shellwords’
Shellwords.shellwords ‘Hello “wo rld” how “are " you today”’
=> [“Hello”, “wo rld”, “how”, “are " you today”]
HTH,
Sebastian
bodikp
March 19, 2008, 5:08pm
#5
Sebastian H. wrote:
Peter B. wrote:
Is there already a built-in method to do this
require ‘shellwords’
Shellwords.shellwords ‘Hello “wo rld” how “are " you today”’
=> [“Hello”, “wo rld”, “how”, “are " you today”]
HTH,
Sebastian
Mmm, that’s yummy! Thanks, I’m using this now. Thanks to all of your
replies, you all rock hard.
bodikp
March 20, 2008, 11:34am
#6
On 19 Mar 2008, at 10:26, Sebastian H. wrote:
Peter B. wrote:
Is there already a built-in method to do this
require ‘shellwords’
Shellwords.shellwords ‘Hello “wo rld” how “are " you today”’
=> [“Hello”, “wo rld”, “how”, “are " you today”]
Or you can pretend it’s CSV:
$ irb
require ‘csv’
=> true
s = ‘the “quick brown” fox jumped “over a lazy” dog’
=> “the “quick brown” fox jumped “over a lazy” dog”
CSV.parse_line s, ’ ’
=> [“the”, “quick brown”, “fox”, “jumped”, “over a lazy”, “dog”]
Unfortunately it doesn’t handle the pesky backslash in Sebastian’s
example above.
s = ‘Hello “wo rld” how “are " you today”’
=> “Hello “wo rld” how “are \” you today”"
CSV.parse_line s, ’ ’
=> []
Oh well!
Cheers,
Andy
bodikp
March 19, 2008, 8:10pm
#7
On 19.03.2008 17:07, Peter B. wrote:
Mmm, that’s yummy! Thanks, I’m using this now. Thanks to all of your
replies, you all rock hard.
Though I’m coming in late to the party: sometimes you can exchange
#split and #scan . This is something I use sometimes:
irb(main):006:0> string = ‘a simple solution that uses “a regular
expression” - see?’
=> “a simple solution that uses “a regular expression” - see?”
irb(main):007:0> quotes = string.scan %r{"[^"]*"|\S+}
=> [“a”, “simple”, “solution”, “that”, “uses”, ““a regular
expression””, “-”, “see?”]
Note: the order of the alternative in the regexp matters! This works
because Ruby’s regex engine is NFA based. Here’s what happens if you
exchange the two
irb(main):008:0> quotes = string.scan %r{\S+|"[^"]*"}
=> [“a”, “simple”, “solution”, “that”, “uses”, ““a”, “regular”,
“expression””, “-”, “see?”]
Kind regards
robert