将字符串中的正则表达式转换为ruby中的regexp对象

我将一个正则表达式作为用户的输入,并将值与该正则表达式匹配。 但是,我遇到的问题是我收到的输入是一个字符串。 例如"/abc|def/i"我无法将其转换为正则表达式对象。 如果它尝试Regexp.new(string)它会逃脱所有字符,所以我得到像/\/abc|def\/i/

我能够使用另一个正则表达式捕获正斜杠之间的部分,并使用它构建一个正则表达式对象。 对于上面的例子,我捕获"abc|def" ,当我做Regexp.new("abc|def")我得到/abc|def/这是我想要的但我需要一种方法来添加正则表达式选项(例如,在上面的例子中’i’)在ruby regexp对象的字符串中。

我怎么能实现这个???

此外,必须有一种更简单的方法来实现所有这一切。 任何帮助将不胜感激。

您可以考虑使用to_regexp gem ; 它不使用eval ,它允许你这样做:

  "/(abc|def)/i".to_regexp # => /(abc|def)/i 

来源: https://github.com/seamusabshere/to_regexp

这是一个快速的方法/#{my_string_pattern}/

不需要魔法

只为了好玩…享受:

 class Regexp def self.parse(s) optmap = { "i" => Regexp::IGNORECASE, "x" => Regexp::EXTENDED, "m" => Regexp::MULTILINE } match = s.match(/\/(.*)\/(.*)/) or raise "Invalid regexp string" pat = match.captures[0] opt_str = match.captures[1] opts = opt_str.split(//).map { |c| optmap[c] }.reduce { |x, n| x | n } Regexp.new(pat, opts) end end # because you aren't hacking Ruby until you've added a method to String... class String def to_regex Regexp.parse(self) end end 

它也有效!

正如您所建议的,我认为您的方法可能是一种处理它的方法。 做这样的事情你可以稍微清理一下……

 class String def to_regexp(case_insensitive = false) str = self[\/(.*)\/,1] Regexp.new(str, case_insensitive) end end 

这只是清理它并使字符串固有的function的一种方法,因此您不必担心它。