2013-06-16 16 views
5

Ho un problema durante la rimozione dei tag \n e \r. Quando uso le virgolette doppie, funziona bene, altrimenti lascia "/". Con gsub, non funziona affatto senza virgolette. Perché?Rimozione delle interruzioni di riga in Ruby

<%= "Remove \n".delete('\n') %> 
result: "Remove" 
<%= 'Remove \n'.delete('\n') %> 
result: "Remove \" 

ho trovato questo perché i risultati non funziona con i risultati dal database ...

risposta

16

stringhe racchiuse tra virgolette singole non di processo più sequenze di escape. Così, quando si ha questa "due stringa di caratteri, dove il primo carattere è backslash e secondo carattere è minuscolo 'n'"

'\n' 

significa letteralmente. Fa non significa "carattere di nuova riga". Per fare in modo che \n significhi newline char, devi metterlo all'interno di una stringa doppia citazione (che elabora questa sequenza di escape). Ecco alcuni esempi:

"Remove \n".delete('\n') # => "Remove \n" # doesn't match 
'Remove \n'.delete('\n') # => "Remove \\" # see below 

'Remove \n'.delete("\n") # => "Remove \\n" # no newline in source string 
"Remove \n".delete("\n") # => "Remove " # properly removed 

NOTA quel carattere backslash in questo particolare esempio (seconda linea, utilizzando stringa di un unico citato in delete chiamata) viene semplicemente ignorato, a causa della logica speciale nel metodo delete. Vedere il documento su String#count per maggiori informazioni. Per ignorare ciò, utilizzare gsub, ad esempio

'Remove \n'.gsub('\n', '') # => "Remove " 
+0

Grazie Sergio. Forse sai come posso convertire i risultati ricevuti dal database, perché penso che siano tratati come nelle virgolette singole – Gediminas

+0

Forse lo so. Ma questo è fuori portata qui :) –

2

Da Ruby Programming/Strings citazioni

unico supporto solo due sequenze di escape.

\' – single quote 
\\ – single backslash 

Fatta eccezione per queste due sequenze di escape, tutto il resto tra virgolette singole viene trattato alla lettera.

Quindi, se si digita \n nel IRB, si torna \\n.

Questo è il motivo per cui si hanno problemi con delete

"Remove \n".delete('\n') #=> "Remove \n".delete("\\n") => "Remove \n" 
'Remove \n'.delete('\n') #=> "Remove \\n".delete("\\n") => "Remove \\" 
+0

La seconda linea produce risultati diversi per me. Ne sei sicuro? –

+0

Ci scusiamo per quell'errore di battitura. –

Problemi correlati