2015-10-30 103 views
2

我有一套Elasticsearch的特殊字符,我需要使用Ruby轉義。Ruby轉義字符串中的一組特殊字符

它們是:+ - = && || > < ! () { } [ ]^" ~ * ? : \ /

我怎樣才能得到任何字符串逃避這些字符?

感謝

+0

看看是否有幫助:http://stackoverflow.com/questions/4140582/ruby-escaping-special-characters-in-a-string –

回答

3

,因爲它是陳述的問題還沒有解決,因爲「逃避隨後的兩個字符」是沒有意義的。你期望得到什麼結果「逃避」,比如&&

我相信,你想逃避一切單個字符,使&&成爲\&\&|| - \|\|。這很容易。

to_escape = %w_+ - = & | > < ! () { } [ ]^" ~ * ? : \ /_ # C"mon, SO parser 
re = Regexp.union(to_escape) 
print 'str (f) | a || b'.gsub(re) { |m| "\\#{m}" } 
#⇒ str \(f\) \| a \|\| b 

另一種可能性是使用Regexp#escape,但它會逃跑多,可能比你需要(如空格)。

2

這是@ mudasobwa的答案的變化,使用的使用String#gsub形式用於更換散列:

escapees = %w$ + - = & | > < ! () { } [ ]^" ~ * ? : \/$ 
    #=> ["+", "-", "=", "&", "|", ">", "<", "!", "(", ")", "{", "}", 
    # "[", "]", "^", "\"", "~", "*", "?", ":", " /"] 
h = escapees.each_with_object({}) { |c,h| h[c] = "\\#{c}" } 
    #=> {"+"=>"\\+", "-"=>"\\-",..., " /"=>"\\ /"} 
h.default_proc = ->(h,k) { k } 

如果散列h沒有一個關鍵kHash#default_proc=導致h[k]到返回k

s = 'str (f) | a || b' 
ss = s.gsub(/./,h) 
    #=> "str \\(f\\) \\| a \\|\\| b" 
puts ss 
    #=> str \(f\) \| a \|\| b