Create a case-insensitive regular expression from a string in Ruby

RubyRegex

Ruby 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTrevor BurnhamView Question on Stackoverflow
Solution 1 - Rubysepp2kView Answer on Stackoverflow
Solution 2 - RubyDavid Tresner-KirschView Answer on Stackoverflow
Solution 3 - RubyAndrew GrimmView Answer on Stackoverflow
Solution 4 - RubyrustyView Answer on Stackoverflow