Does this make sense to anyone?

  def test_match(str, re)
    puts "'#{str}' " + ((str =~ re) ? "matched" : "didn't match")
  end

  re1 = /hello world/
  re2 = /hello world/x
  if re1 == re2
    puts "The two expressions are equal?"
  end
  puts "Trying the first RE"
  test_match("hello world", re1)
  test_match("helloworld", re1)
  puts "Trying the second RE"
  test_match("hello world", re2)
  test_match("helloworld", re2)

They don't seem very equal to me!  Now all of this is
as documented.  However right now it is causing me
pain.  I would like to be able to take an arbitrary RE
as input and turn that into a tokenizer.  I will be
calling the index method on a string, so the obvious
approach is to grab the source of the RE, prepend \G to
it, then recompile with the same options and lang.

This doesn't work though because the only option that I
can grab is casefold? (for case insensitive).  Also I
need to translate from the kcode back to the option for
the lang.  Luckily calling to_s on it succeeds for the
latter.  So the following appears to be the best that
I can do:

  new_re = Regexp.new("\\G" + re.source, re.casefold?, re.kcode.to_s)

However if someone tries to use this with /m or /x
they will get unexpected results. :-(

Is there any possibility that REs could keep track of
what options they were compiled with, check that in
the == method, and make that available back to me?

Thanks,
Ben

PS Bug report for Programming Ruby.  On page 367 the
third optional constant you may use in the new method
is Regexp::MULTILINE, not Regexp::POSIXLINE.

PPS Coming from Perl I find it disconcerting to see
Ruby's /m flag combine options that I am used to seeing
separately as /s and /m.
_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com