[英]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
这是一个快速的方法/#{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.