2010-05-06 7 views
5

Non posso per la vita di me capirlo, anche se dovrebbe essere molto semplice.Ruby - Escape Parenthesis

Come posso sostituire tutte le occorrenze di "(" e ")" su una stringa con "\(" e "\)"?

nulla sembra funzionare:

"foo (bar) foo".gsub("(", "\(") # => "foo (bar) foo" 

"foo (bar) foo".gsub("(", "\\(") # => "foo \\(bar) foo" 

Qualche idea?

risposta

4

Hai già il soluzione con il tuo secondo tentativo, sei stato solo confuso perché la stringa viene visualizzata in forma di escape nell'interprete interattivo. Ma in realtà c'è solo un backslash non due. Provare a stampare utilizzando mette e vedrete che non v'è in realtà solo una barra rovesciata:

> "foo (bar) foo".gsub("(", "\\(") 
=> "foo \\(bar) foo" 
> puts "foo (bar) foo".gsub("(", "\\(") 
foo \(bar) foo 

Se avete bisogno di ulteriori convincente, provate a prendere la lunghezza della stringa:

> "foo (bar) foo".length 
=> 15 
> "foo (bar) foo".gsub("(", "\\(").length 
=> 16 

Se fosse aggiunto due barre rovesciate sarebbe Stampa 17 non 16.

+0

Grazie mille! –

0

In una stringa creata con virgolette, \ fugge il carattere successivo. Quindi, per ottenere una barra rovesciata nella stringa, è necessario sfuggire alla barra rovesciata: "\\(". O potresti semplicemente usare una stringa a virgolette singole, che fa meno pre-elaborazione: '\('.

1

"foo (bar) foo".gsub("(", "\\\\(") funziona. Se stai cercando in console, probabilmente stai vedendo la stringa \\( perché console emette la stringa con ispezionare, che sfugge al \

Prova con: puts "foo (bar) foo".gsub("(", "\\(") e vedrete

3

Ecco quello che ho appena usato per sostituire entrambe le parentesi in una sola chiamata:

str.gsub(/(\(|\))/,'\\\\\1')