Ruby gsub with `"\'"` [duplicate]

yc0p9oo0  于 2023-05-17  发布在  Ruby
关注(0)|答案(1)|浏览(94)

此问题已在此处有答案

Why does String#gsub double content?(3个答案)
6天前关闭。
我只是不明白这种行为是否是预期的。
我尝试将字符串中的'字符替换为2个字符\'(基本上是通过在引号之前添加\来转义引号)
我天真的方法是这个str.gsub("'", "\\'"),但我得到了奇怪的结果。我最终使用str.gsub("'") { "\\'" }使它工作,但我想在这里了解gsub的行为。
以下是我尝试的:

str2 = "super'test"
 => "super'test"
str2.gsub("'", "\\'")
 => "supertesttest"                # <==== ??? Where does that comes from ?

# Further tests are to understand if `gsub` behaves as I would expect, and it does...
str2.gsub("'", "")
 => "supertest"
str2.gsub("'", "\\")
 => "super\\test"
str2.gsub("t", "ab")
 => "super'abesab"
str2.gsub("t", "\b")
 => "super'\bes\b"
str2.gsub("t", "\\b")
 => "super'\\bes\\b"
str2.gsub("t", "\'")
 => "super''es'"
str2.gsub("'", "\'")
 => "super'test"
str2.gsub("'", "\\ '")
 => "super\\ 'test"

str2.gsub("'", "\\'")
 => "supertesttest" # I really don't get it....
str2.gsub("'") { "\\'" }
 => "super\\'test" # This works
snvhrwxg

snvhrwxg1#

引用文档:
\'对应$',包含匹配后的字符串。
[...]
请注意,\\被解释为转义,即单个反斜杠。
[...]
如果你想在replacement中写一个非反向引用的字符串\&,你首先需要转义反斜杠以防止这个方法将其解释为反向引用,然后你需要再次转义反斜杠以防止字符串字面量消耗它们:"..\\\\&.."
您可能希望使用块形式,以避免大量的反斜杠。

相关问题