2013-06-16 6 views
5

\n\rタグを削除する際に問題があります。私は二重引用符を使用しているとき、それはokを残す。 gsubでは、二重引用符をまったく使用しないと動作しません。どうして?Rubyで改行を削除する

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

結果は、それがデータベースからの結果では動作しませんので、私は

答えて

16

に問題があるのはこのためです。あなたはこの

'\n' 

を持っているときに、それは文字通り「『n』の最初の文字がバックスラッシュと2番目の文字が小文字である、2つの文字列を、」意味。 ではなく、という意味の "改行文字"です。 \nが改行文字を意味するためには、二重引用符で囲まれた文字列(このエスケープシーケンスを処理します)の中に置く必要があります。

"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 

NOTEこの特定の例では、バックスラッシュ文字(deleteコールでの単一引用符で囲まれた文字列を使用して、第2のラインは、)という理由だけdelete方法で特別なロジックで、無視されます。ここではいくつかの例があります。詳細については、String#countのdocを参照してください。これを回避するには、

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

Sergioに感謝します。たぶん私は彼らが単一引用符で囲まれていると思うので、データベースから受け取った結果をどのように変換することができるか分かります – Gediminas

+0

おそらく私は知っています。しかし、それは範囲外です:) –

2

Ruby Programming/Stringsから単一引用符が2つのだけのエスケープシーケンスをサポートして...これを見つけました。

\' – single quote 
\\ – single backslash 

これらの2つのエスケープシーケンスを除いて、一重引用符間のその他すべては文字通り扱われます。

したがって、\nをirbに入力すると、\\nに戻ります。

あなたはシングル引用符で囲まれた文字列は、ほとんどのエスケープシーケンスを処理しませんdelete

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

のように、gsubを使用してください。それ本当? –

+0

オススメして申し訳ありません。 –

関連する問題