Carlos
12/11/2006 10:03:00 AM
Peter Szinek wrote:
> Carlos wrote:
>
>> Peter Szinek wrote:
>>
>>> Hello,
>>>
>>> I need to match a chunk of code like this:
>>>
>>> ....
>>> ....
>>> #begin here
>>> ...}
>>> ......end
>>> ...}
>>> ......}
>>> .....end
>>> ...
>>> ...
>>>
>>> I need to match from "the #begin here" up to the n-th closing token
>>> (i.e. '}' or 'end'). n can be arbitrary (let's consider that it is
>>> meaningful, i.e. there are no more '}' + 'end's than n.
>>
>>
>> n = 4
>> text =~ /#begin(.*(\}|end)){#{n}}/m
>
>
> Sorry, I need to 'scan' it. I have been playing around with similar
> regexps, but they did not work out. E.g. also yours:
>
> irb(main):007:0> text = '.... #begin aaaa end bbb } ccc end ddd'
> => ".... #begin aaaa end bbb } ccc end ddd"
> irb(main):008:0> n = 2
> => 2
> irb(main):009:0> text.scan(/#begin(.*(\}|end)){#{n}}/m)
> => [[" ccc end", "end"]]
>
> does not work with scan...
To make it work with scan just make the parens non-capturing:
irb(main):001:0> text = "#begin aaa end bbb } ccc } #begin ddd end eee
end fff"
=> "#begin aaa end bbb } ccc } #begin ddd end eee end fff"
irb(main):002:0> text.scan(/#begin(?:.*?(?:\}|end)){2}/m)
=> ["#begin aaa end bbb }", "#begin ddd end eee end"]
Good luck.
--