我有一套Elasticsearch的特殊字符,我需要使用Ruby轉義。Ruby轉義字符串中的一組特殊字符
它們是:+ - = && || > < ! () { } [ ]^" ~ * ? : \ /
我怎樣才能得到任何字符串逃避這些字符?
感謝
我有一套Elasticsearch的特殊字符,我需要使用Ruby轉義。Ruby轉義字符串中的一組特殊字符
它們是:+ - = && || > < ! () { } [ ]^" ~ * ? : \ /
我怎樣才能得到任何字符串逃避這些字符?
感謝
,因爲它是陳述的問題還沒有解決,因爲「逃避隨後的兩個字符」是沒有意義的。你期望得到什麼結果「逃避」,比如&&
?
我相信,你想逃避一切單個字符,使&&
成爲\&\&
和||
- \|\|
。這很容易。
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
,但它會逃跑多,可能比你需要(如空格)。
這是@ mudasobwa的答案的變化,使用的使用String#gsub形式用於更換散列:
escapees = %w$ + - = & | > < ! () { } [ ]^" ~ * ? : \/$
#=> ["+", "-", "=", "&", "|", ">", "<", "!", "(", ")", "{", "}",
# "[", "]", "^", "\"", "~", "*", "?", ":", " /"]
h = escapees.each_with_object({}) { |c,h| h[c] = "\\#{c}" }
#=> {"+"=>"\\+", "-"=>"\\-",..., " /"=>"\\ /"}
h.default_proc = ->(h,k) { k }
如果散列h
沒有一個關鍵k
,Hash#default_proc=導致h[k]
到返回k
。
s = 'str (f) | a || b'
ss = s.gsub(/./,h)
#=> "str \\(f\\) \\| a \\|\\| b"
puts ss
#=> str \(f\) \| a \|\| b
看看是否有幫助:http://stackoverflow.com/questions/4140582/ruby-escaping-special-characters-in-a-string –