繁体   English   中英

将字符串中的正则表达式转换为 ruby 中的正则表达式 object

[英]Convert a regular expression in a string to a regexp object in ruby

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

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

我怎么能做到这一点???

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

您可能会考虑使用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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM