Ruby 1.9.3 および 1.8.7 の文字列で、単一引用符 (') をエスケープされた単一引用符 (\') に置き換えようとしています。
正確な問題の文字列は、「'%@' を削除してもよろしいですか」です。この文字列は、「\'%@\' を削除してもよろしいですか」となります。
.gsub!(/\'/,"\'") を使用すると、次の文字列 "Are you sure you want to %@'%@" が生成されます。
何が起こっているかについてのアイデアはありますか?
String#gsub
フォームgsub(exp,replacement)
には、置換文字列に影響を与える奇妙な癖があり、多くのエスケープスラッシュが必要になることがあります。Rubyユーザーは、代わりにブロックフォームを使用するように指示されることがよくあります。
str.gsub(/'/){ "\\'" }
エスケープを完全に廃止したい場合は、別の文字列リテラル形式の使用を検討してください。
str.gsub(/'/){ %q(\') }
これらのタイプのリテラルを確認することに慣れたら、エスケープシーケンスを回避するためにそれらを使用すると、コードがはるかに読みやすくなります。
\'
置換置換文字列では、「一致後の元の文字列の部分」を意味します。したがってstr.gsub!(/\'/,"\\'")
、文字をその後のすべてに置き換え'
ます-これはあなたが気づいたことです。
交換では、バックスラッシュをさらに回避する必要があります。.gsub(/'/,"\\\\'")
私のirb
コンソールで動作します:
irb(main):059:0> puts a.gsub(/'/,"\\\\'")
Are you sure you want to delete \'%@\'
You need to escape the backslash. What about this?
"Are you sure you want to delete '%@'".gsub(/(?=')/, "\\")
# => "Are you sure you want to delete \\'%@\\'"
The above should be what you want. Your expected result is wrong. There is no way to literally see a single backslash when it means literally a backslash.