Here's what we came up with using StringScanner:
def processed_answer
scanner = StringScanner.new(correct_answers)
# last position the scanner was in
last_pos = 0
output = []
while scanner.scan_until(/\[(.+?)\]/) # non-greedy matching so we
only swallow the first bracket
# scanner[0] contains the string matched by the regexp
# scanner[1] contains the value surrounded the parantheses in
the regexp
# current position is right up to bracketed text
current_pos = scanner.pos - 1 - scanner[0].length
# the 'chunk' is the text from the last position the scanner
stopped at
# up to the current position
chunk = scanner.string[last_pos .. current_pos]
output << chunk unless chunk.empty?
# store the position the scanner is at for next time round the
loop
last_pos = scanner.pos
# extract the question answer thingies
answers = scanner[1].split(',') # returns array
# strip whitespace around each possible answer
answers.each {|v| v.strip! } # works because strip! is
destructive
# add answers array
output << answers
end
# make sure we have any text after the last question/answer
last_chunk = scanner.string[last_pos..-1]
output << last_chunk unless last_chunk.empty?
output
end
On Sep 8, 12:52 pm, Brendon <[EMAIL PROTECTED]> wrote:
> Woah dude! Thanks for that :) I'll work my way through understanding
> it now :)
>
> Cheers!
>
> Brendon
>
> On Sep 6, 3:22 am, "Pardee, Roy" <[EMAIL PROTECTED]> wrote:
>
> > This is kinda ghetto (particularly needing to check chunk.length) but it
> > works on your sample string.
>
> > def parse_item(lin)
> > ret = Array.new
> > re = Regexp.new(/([^\[\]]+?(\[|\]))+?/)
> > lin.split(re).each do |chunk|
> > if chunk.length > 1 then
> > case chunk
> > when /\]$/
> > # bracketed option list
> > ret << chunk[0..-2].split(',')
> > else
> > # plain chunk of text
> > ret << chunk.gsub(/\[$/, '').strip
> > end
> > end
> > end
> > ret.inspect
> > end
>
> > HTH,
>
> > -Roy
>
> > -----Original Message-----
> > From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf
> > OfBrendon
> > Sent: Wednesday, September 03, 2008 6:28 PM
> > To: Ruby on Rails: Talk
> > Subject: [Rails] Regular Expression help
>
> > Hi everyone, I hope it's appropriate to post this question here. I couldn't
> > find anywhere else to post it (posting to the Ruby group didn't work). I'm
> > trying to write a regular expression to turn this
> > string:
>
> > 'johnny went to the [shops] and played [games,soccer,foot ball] with
> > others.'
>
> > into this:
>
> > ['johnny went to the', ['shops'], 'and played', ['games', 'soccer', 'foot
> > ball'], 'with others.']
>
> > Key features are that white space needs to be stripped from around the
> > snippets, and I need to be able to determine which parts are just normal
> > text and which parts are to be used as gaps where people fill in the
> > missing info. If you haven't already figured it out, this is for a
> > children's quiz engine. When a phrase appears in square brackets it's a
> > blank, the system will display a text box for the user to type into. If
> > there are multiple items in the square brackets seperated by comma's (and
> > optional spaces around the comma's by lazy users) then the system will
> > display the choices in a random order in a drop down box (the first choice
> > in the list is the correct one).
>
> > I've had a long go at it myself but I just don't fully grasp the regexp
> > language:
>
> > irb(main):027:0> 'johnny went to the [shops] and played [games,soccer,foot
> > ball] with others.'.split(/\[(?:([(?:\s)\w(?:\s)]+)(?:,([(?:\s)\w(?:\s)]
> > +))*)\]/)
> > => ["johnny went to the ", "shops", " and played ", "games", "foot ball", "
> > with others."]
>
> > I've tried doing groupings but it seems to make things worse :)
>
> > Any help would be truly appreciated :)
>
> > Cheers,
>
> >Brendon
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---