簡體   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