From: Ben Tilly Date: 2001-02-06T21:08:20+09:00 Subject: [ruby-talk:10417] Recall Regexp options? 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