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

时间:2011-07-12 18:47:33

标签: ruby-on-rails ruby regex ruby-on-rails-3

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

这样的东西

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

我怎样才能实现这个目标?

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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:5)

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

不需要魔法

答案 2 :(得分:4)

只是为了好玩......享受:

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

它也有效!

答案 3 :(得分:0)

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

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

这只是清理它的一种方法,并使字符串固有的功能,所以你不必担心它。