3

Ruby 1.9.3 および 1.8.7 の文字列で、単一引用符 (') をエスケープされた単一引用符 (\') に置き換えようとしています。

正確な問題の文字列は、「'%@' を削除してもよろしいですか」です。この文字列は、「\'%@\' を削除してもよろしいですか」となります。

.gsub!(/\'/,"\'") を使用すると、次の文字列 "Are you sure you want to %@'%@" が生成されます。

何が起こっているかについてのアイデアはありますか?

4

3 に答える 3

8

String#gsubフォームgsub(exp,replacement)には、置換文字列に影響を与える奇妙な癖があり、多くのエスケープスラッシュが必要になることがあります。Rubyユーザーは、代わりにブロックフォームを使用するように指示されることがよくあります。

str.gsub(/'/){ "\\'" }

エスケープを完全に廃止したい場合は、別の文字列リテラル形式の使用を検討してください。

str.gsub(/'/){ %q(\') }

これらのタイプのリテラルを確認することに慣れたら、エスケープシーケンスを回避するためにそれらを使用すると、コードがはるかに読みやすくなります。

于 2012-12-11T10:37:09.327 に答える
1

\'置換置換文字列では、「一致後の元の文字列の部分」を意味します。したがってstr.gsub!(/\'/,"\\'")、文字をその後のすべてに置き換え'ます-これはあなたが気づいたことです。

交換では、バックスラッシュをさらに回避する必要があります。.gsub(/'/,"\\\\'")私のirbコンソールで動作します:

irb(main):059:0> puts a.gsub(/'/,"\\\\'")
Are you sure you want to delete \'%@\'
于 2012-11-19T16:59:31.293 に答える
0

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.

于 2012-11-19T16:57:55.453 に答える