我将一个正则表达式作为用户的输入,并将值与该正则表达式匹配。
但是,我遇到的问题是我收到的输入是一个字符串。
例如"/abc|def/i"
我无法将其转换为正则表达式对象。
如果尝试Regexp.new(string)
它逃脱了所有角色,所以我得到像/\/abc|def\/i/
我能够使用另一个正则表达式捕获正斜杠之间的部分,并使用它构建一个正则表达式对象。对于上面的示例,我捕获"abc|def"
,当我Regexp.new("abc|def")
时,我得到/abc|def/
这是我想要的,但我需要一种方法来添加正则表达式选项(例如'我'在上面的例子)在ruby regexp对象的字符串中。
我怎样才能实现这个目标?
此外,必须有一种更简单的方法来实现所有这一切。 任何帮助将不胜感激。
答案 0 :(得分:5)
您可以考虑使用to_regexp gem;它不使用eval
,它允许你这样做:
"/(abc|def)/i".to_regexp
# => /(abc|def)/i
答案 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
这只是清理它的一种方法,并使字符串固有的功能,所以你不必担心它。