2011-07-12 32 views
2

我將正則表達式作爲用戶的輸入,並將值與該正則表達式匹配。 但是,我的問題是,我收到的輸入是一個字符串。 例如"/abc|def/i" 而我無法將其轉換爲正則表達式對象。 如果嘗試Regexp.new(string) 它避開了所有的角色,所以我得到的東西像/\/abc|def\/i/將字符串中的正則表達式轉換爲ruby中的正則表達式對象

我能捕捉到正向之間的斜線部分使用另一個正則表達式,並用它建立一個RegExp對象。對於上面的例子,我捕獲"abc|def",當我做Regexp.new("abc|def")我得到/abc|def/這是我想要的,但我需要一種方法來也正則表達式選項(例如上面的例子中'我')在字符串中添加到ruby正則表達式對象。

我該如何做到這一點???

此外,必須有一個更簡單的方法來實現所有這一切。 任何幫助將不勝感激。

+0

'Regexp.new'只逃脫了 「分隔符」('/')和改性劑('i')。爲什麼不讓用戶放下分隔符並分別輸入任何修飾符?看看他們是如何解決它在http://rubular.com –

回答

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 

它的工作原理呢!

+0

看起來它會需要選項,否則會失敗。否則,我喜歡你這樣做的方式。 – Ryanmt

+0

沒有。工作正常,沒有選擇。在這種情況下,捕獲組只是一個空字符串。 –

+0

你是對的,謝謝。我會在將來更仔細地閱讀代碼。 – Ryanmt

0

正如你建議

"/(abc|def)/i".to_regexp 
# => /(abc|def)/i 

來源,我覺得你的方法可能是處理它的方式。你可以做這樣的事情清理一點點......

class String 
    def to_regexp(case_insensitive = false) 
    str = self[\/(.*)\/,1] 
    Regexp.new(str, case_insensitive) 
    end 
end 

這只是一種方式把它清理乾淨,使固有的字符串的功能,所以你不必擔心。

5

這裏有一個快速的方法來做到這一點 /#{my_string_pattern}/

沒有魔法需要

+3

將不能使用選項... – Jakobinsky

+0

簡單是幸福 –

+0

夠好爲了我。 – hopia

相關問題