From: dblack@... Date: 2006-01-07T12:49:32+09:00 Subject: Re: Oniguruma lookbehind question Hi -- On Sat, 7 Jan 2006, K.Kosako wrote: > dblack@wobblini.net wrote: > >> For some reason, lookbehind and alternation seem not to be playing >> together in a little Oniguruma test. This is based on the string >> splitting thread from a little while ago this evening, and uses a CVS >> 1.9.0 Ruby acquired about 1/2 an hour ago. >> >> str = %Q{abc def "ghi jkl" mno} >> >> # Look for "..." but just get the ... part: >> re1 = /(?<=")[^"]+(?=")/ >> >> # Test that: >> p str.scan(re1) # => ["ghi jkl"] >> >> # Now, do the same thing *or* \S+. This should, I think, >> # pick up the abc, def, and mno substrings too. >> >> re2 = /((?<=")[^"]+(?="))|(\S+)/ >> >> # But it doesn't; the part before the alternation never >> # matches, even though it did before (as shown by the >> # captures): >> >> p str.scan(re2) >> # => [[nil, "abc"], [nil, "def"], [nil, "\"ghi"], [nil, "jkl\""], >> # [nil, "mno"]] >> >> I know that's all a bit cluttered, but the basic thing is that a >> sub-pattern using lookbehind doesn't seem to match any more when >> there's an alternation. Instead, only the second alternative ever >> matches. > > Is this pattern work for you? > > str = %Q{abc def "ghi jkl" mno} > re3 = /((?<=")[^"]+(?="))|([\S&&[^"]]+)/ > p str.scan(re3) #=> [[nil, "abc"], [nil, "def"], ["ghi jkl", nil], [nil, > "mno"]] No; I get this: [[nil, "\""], ["ghi jkl", nil], [nil, "\""]] This: /(?<=")[^"]+(?=")|[^\s"]+/ gives me the result you got for your re3. But it still seems to be based on the right-hand alternate being checked first. David -- David A. Black dblack@wobblini.net "Ruby for Rails", from Manning Publications, coming April 2006! http://www.manning.com/books/black