From: Bob Showalter Date: 2005-12-22T06:48:30+09:00 Subject: Re: Odd behavior of String#scan 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,".