Reputation: 1041
I frequently need to convert a String into a Regexp. For many strings, Regexp.new(string)
is sufficient. But if string
contains special characters, they need to be escaped:
string = "foo(bar)"
regex = Regexp.new(string) # => /foo(bar)/
!!regex.match(string) # => false
The Regexp class has a nice way to escape all characters that are special to regex: Regexp.escape
. It's used like so:
string = "foo(bar)"
escaped_string = Regexp.escape(string) # => "foo\\(bar\\)"
regex = Regexp.new(escaped_string) # => /foo\(bar\)/
!!regex.match(string) # => true
This really seems like this should be the default way Regexp.new
works. Is there a better way to convert a String to a Regexp, besides Regexp.new(Regexp.escape(string))
? This is Ruby, after all.
Upvotes: 0
Views: 2721
Reputation: 1041
You should never need to run Regexp.new(Regexp.escape(string))
This is because, in Core and StdLib, practically every method that takes a Regexp also takes a String (as it should).
In the original case, if you're trying to match a big String big_string
on a wacky string with special characters like "foo(bar)"
, you can just run big_string.match("foo(bar)")
.
If you're trying to do something fancier, you might need use both ::escape
and ::new
, but never in direct composition. For example, if we want to match big_string
on a wacky string followed by a lone digit, we'll run Regexp.new(Regexp.escape(string) + "\\d")
.
Upvotes: 2