5

次のスニペットを検討してください。

puts 'hello'.gsub(/.+/, '\0 \\0 \\\0 \\\\0')

これは出力します ( ideone.com で見られるように):

hello hello \0 \0

代わりに次のようなものが表示されることを期待していたので、これは非常に驚くべきことでした。

hello \0 \hello \\0

私の主張は、それはエスケープ文字であるため、リテラルのバックスラッシュを取得する\ために書くため、リテラルのバックスラッシュの後に などが続くということです。\\\\0\0gsub

そして、上記の代替品を入手するにはどうすればよいですか?

4

1 に答える 1

7

二重引用符ではなく単一引用符を使用すると、エスケープが制限されます。

puts 'sinlge\nquote'
puts "double\nquote"

"\0"はヌル文字 (文字列の末尾を決定するために C で使用されます'\0')です。今戻ってきたのは、単一引用符と二重引用符の違いを念頭に置いていないプログラマーに対処しようとしている ruby​​ です。実際、これは:と. このロジックに従って、どう考えても、これが ruby​​ が他の文字列を見る方法です: bothとequal 。gsub がマッチ番号 x を挿入するために使用するように、をエスケープする方法が必要です。"\\0"'hello'.gsub(/.+/, '\0')'hello'.gsub(/.+/, "\\0")"hello"'hello'.gsub(/.+/, "\0")"\000"'hello'.gsub(/.+/, '\\0')'hello'gsub'\0' == "\\0"'\\0' == "\\0"'\\\0''\\\\0'"\\\\0"\\0\x\x\\x"\\\\x"

したがって、行

puts 'hello'.gsub(/.+/, "\\0 \\\\0 \\\\\\0 \\\\\\\\0")

実際に

hello \0 \hello \\0
于 2010-06-12T13:21:11.110 に答える