I have been experimenting with building regular expressions from
components with ruby from CVS and have noticed some unexpected
behaviour.

To take a simple case, which works as expected:

[mike@ratdog src]$ irb --simple-prompt
>> m = /[Mm]ike/
=> /[Mm]ike/
>> s = /[Ss]tok/
=> /[Ss]tok/
>> 'mike stok' =~ /^#{m} #{s}$/
=> 0
>> 'Mike Stok' =~ /^#{m} #{s}$/
=> 0

when I try setting up m and s to be case insensitive then

>> m = /mike/i
=> /mike/i
>> s= /stok/i
=> /stok/i
>> 'mike stok' =~ /^#{m} #{s}$/
=> nil

I would have expected that to work, so I look at what the regular
expression looks like:

=> /^(?i-mx:mike) (?i-mx:stok)$/
>> 'mike stok' =~ /^(?i-mx:mike) (?i-mx:stok)$/
=> nil
# I expected 0 here, not nil
>> 'mike stok' =~ /^(?i:mike) (?i:stok)$/
=> 0

Removing the -mx seems to make it work, and as m and x modifiers don't
matter to this match I try with them:

>> 'Mike Stok' =~ /^(?imx:mike) (?imx:stok)$/
=> 0

Is there a flaw in the handling of the - in (?i-mx: ... ) in the regular
expression?  In Perl it seems to work, so I don't think my expectation
is too wild:

  DB<1> print 'mike stok' =~ /^(?i-mx:mike) (?i-mx:stok)$/
  1


It would be good if this worked, as I can then build regular expressions
out of sub-expressions without interpolating strings...

Is this a flaw in Ruby or my expectations?

Mike
-- 
mike / stok.co.uk                    |           The "`Stok' disclaimers" apply.
http://www.stok.co.uk/~mike/       | GPG PGP Key      1024D/059913DA 
mike / exegenix.com                  | Fingerprint      0570 71CD 6790 7C28 3D60
http://www.exegenix.com/           |                  75D2 9EC4 C1C0 0599 13DA