2013-06-16 18 views
5

Mam problem z usuwaniem znaczników \n i \r. Kiedy używam podwójnych cudzysłowów, działa dobrze, w przeciwnym razie pozostawia "/". Z gsub nie działa w ogóle bez podwójnych cudzysłowów. Czemu?Usuwanie podziałów wierszy w Ruby

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

znalazłem to, ponieważ wyniki nie działa z wynikami z bazy danych ...

Odpowiedz

16

pojedynczych cudzysłowów nie przetwarza większość sekwencje. Tak więc, gdy masz ten

'\n' 

to dosłownie oznacza „dwa ciąg znaków, gdzie pierwszy znak backslash i drugi znak jest małą literą«n»”. To ma wartość , a nie oznacza "znak nowej linii". Aby \n oznaczało znak nowej linii, musisz umieścić go w łańcuchu z podwójnym cudzysłowem (który przetwarza sekwencję specjalną). Oto kilka przykładów:

"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 

UWAGA że znak backslash w tym konkretnym przykładzie (druga linia, przy użyciu pojedynczego cytowany ciąg w delete rozmowy) jest po prostu ignorowane, ponieważ specjalnej logiki w sposobie delete. Więcej informacji znajduje się w dokumencie na stronie String#count. Aby ominąć to, użyj gsub, na przykład

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

Sergio dzięki. Może wiesz, jak mogę przekonwertować wyniki otrzymane z bazy danych, ponieważ myślę, że są traktowane jak w pojedynczych cytatach. – Gediminas

+0

Może wiem. Ale to jest poza zasięgiem :) –

2

Od Ruby Programming/Strings

Pojedyncze cudzysłowy obsługuje tylko dwie sekwencje.

\' – single quote 
\\ – single backslash 

Z wyjątkiem tych dwóch sekwencji unikowych, wszystko inne między pojedynczymi cudzysłowami jest traktowane dosłownie.

Jeśli wpiszesz w irbku \n, wrócisz \\n.

To dlatego masz problemy z delete

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

Twoja druga linia daje dla mnie różne wyniki. Jesteś tego pewien? –

+0

Przepraszamy za tę literówkę. –

Powiązane problemy