Bob Showalter
12/21/2005 9:49:00 PM
Warren Brown wrote:
> First off, the problem I am trying to solve can be simplified down
> to:
>
> 'abcSTARTdef,ghi,jkl,ENDmno'.scan(/START([^,]*,)*END/)
>
> What I want is [["def,"], ["ghi,"], ["jkl,"]] (or the same thing
> without the commas), and I still need a way to achieve this. I can
> accomplish it with:
>
> 'abcSTARTdef,ghi,jkl,ENDmno'.scan(/START(.*)END/)[0][0].split(/,/)
>
> But this does two operations where it seems like one should suffice.
> Does someone know of a way to do this in a single operation?
I would suggest:
'abcSTARTdef,ghi,jkl,ENDmno'.match(/START(.*)END/)[1].split(',')
I don't know of a way to accomplish it in one step. String#scan attempts
to match the whole regex at multiple places within the string; but you
need the START and END to delimit the substring over which scan operates.
>
>
> Back to the odd behavior, the first expression actually returns
> [["jkl,"]]. I can't figure out how that is the correct answer by any
> reasonable definition of "scan". However, the equivalent String#match
> does the same kind of thing, so I must be missing something. Can
> someone please explain this behavior?
Because you have this:
([^,]*,)*
The final * allows the group to match multiple times. The MatchData will
hold only the last match however, which is "jkl,".