Create a case-insensitive regular expression from a string in Ruby
RubyRegexRuby Problem Overview
Let's say that I have an arbitrary string like
`A man + a plan * a canal : Panama!`
and I want to do a regex search for strings that are the same other than case. That is, this regular expression should match the string
`a man + A PLAN * a canal : PaNaMa!`
I take it the best approach is to backslash-escape every character with a special meaning in Ruby regular expressions, and then do Regexp.new
with that string and Regexp::IGNORECASE
as arguments. Is that right? Is there a tried-and-true regular expression for converting arbitrary strings into literal regular expressions?
By the way, I ultimately want to use this regular expression to do an arbitrary case-insensitive MongoDB query. So if there's another way I could be doing that, please let me know.
Ruby Solutions
Solution 1 - Ruby
You can use Regexp.escape
to escape all the characters in the string that would otherwise be handled specially by the regexp engine.
Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), Regexp::IGNORECASE)
or
Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), "i")
Solution 2 - Ruby
Ruby regexes can interpolate expressions in the same way that strings do, using the #{}
notation. However, you do have to escape any regex special characters. For example:
input_str = "A man + a plan * a canal : Panama!"
/#{Regexp.escape input_str}/i
Solution 3 - Ruby
If you know the regular expression you want already, you can add "i" after the expression (eg /the center cannot hold it is too late/i
) to make it case insensitive.
Solution 4 - Ruby
A slightly more syntactic-sugary way to do this is to use the %r
notation for Regexp literals:
input_str = "A man + a plan * a canal : Panama!"
%r(#{Regexp.escape(input_str)})i
Of course it comes down to personal preference.