[英]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.