On Dec 1, 2008, at 4:32 PM, Joe Wfel wrote:
> On 1 d. 08, at 14:52, Kyle Schmitt wrote:
>> On Mon, Dec 1, 2008 at 1:51 PM, Kyle Schmitt  
>> <kyleaschmitt / gmail.com> wrote:
>>> I just wanted to mention another way of combining regexes that may
>>> help you stay sane: union.
>>>
>>> #You write each regex nice and simple like..
>>> startswith=/~23430000/
>>> codered=/CodeRed/
>>>
>>> #Then combine them to a complex one
>>> combined_regex=Regexp.union(startswith,codered)
>>>
>>> When you've got to build up some large regular expressions, this can
>>> be a godsend, especially when revisiting code you haven't looked  
>>> at in
>>> awhile.
>>>
>>> --Kyle
>>
>> Scratch that, not thinking clearly!  This is to match startswith OR
>> codered, not necessarily both.
>>
>> Still, I maintain that this is a way of staying sane with complex  
>> regexes :)
>>
>
> Interesting that there is a union function but no intersection  
> function.


How would you even define a regexp (re) that matched only when both of  wo other regexps (re1, re2) matched?

     class Regexp
       def self.intersection(re1,re2)
         union(compile(/(?>#{re1}).*#{re2}/),
               compile(/(?>#{re2}).*#{re1}/))
       end
     end

     re = Regexp.intersection(re1,re2)

What would you expect the value to be?  And while Regexp.union is well- ehaved for multiple arguments, the expansion for more arguments in  
the intersection gets ugly fast.

-Rob

Rob Biedenharn		http://agileconsultingllc.com
Rob / AgileConsultingLLC.com