Ruby 将 String 中的反斜杠替换为双反斜杠 [duplicate]

Ruby replace backslash with double backslash in a String [duplicate]

提问人:Nicola Mingotti 提问时间:11/6/2023 更新时间:11/6/2023 访问量:69

问:

我有一个困扰我的小问题。我需要将字符串中的每个反斜杠加倍,例如,如果有一个字符串,我会将其转换为.我不明白为什么下面的代码会失败。你能帮忙吗?请不要告诉我拆分为字符并操作列表元素然后加入;)我需要知道这是否是一个错误,或者我是否遗漏了什么。再见1 \ 21 \\ 2sub

irb> s = '1 \\ 2'
irb> puts s
1 \ 2
irb> s.size 
5
irb> s[2]
"\\"
# now i try to do the substitution
irb> s2 = s.sub('\\', '\\'*2)   # or '\\\\'
"1 \\ 2"
irb> s2.size
5
Ruby 字符串 替换 反斜杠

评论

0赞 Nicola Mingotti 11/6/2023
很遗憾这篇文章被否决了。许多在几种编程语言方面有经验的人都会在这里。因为这不是人们对替换的期望。例如,在 Python 中,仅举一例,做人们所期望的。s = "\\" ; s.replace("\\","\\\\")

答:

4赞 Alex 11/6/2023 #1

请注意,这被解释为转义,即单个反斜杠。\\

另请注意,字符串文本使用反斜杠。有关字符串文本的详细信息,请参阅字符串文本。

反向引用通常前面有一个额外的反斜杠。例如,如果要编写反向引用以替换为双引号字符串文字,则需要编写 .\&"..\\&.."

如果要在 中写入非反向引用字符串,则需要首先对反斜杠进行转义,以防止此方法将其解释为反向引用,然后需要再次对反斜杠进行转义,以防止字符串文字使用它们: .\&replacement"..\\\\&.."

https://ruby-doc.org/3.2.2/String.html#class-String-label-Substitution+Methods

这意味着你需要更多的反斜杠:

>> "1 \\ 2".sub("\\", "\\"*4)
=> "1 \\\\ 2"
# or
>> "1 \\ 2".sub("\\", Regexp.escape("\\\\"))
=> "1 \\\\ 2"

评论

0赞 Nicola Mingotti 11/6/2023
感谢您的回答并指向文档!我不知道 String.sub 反向引用。另一个层次的逃避是有道理的。更具体地说,来自 doc ,它将应用于从文本读入字符串的相同规则加倍。Note that \\ is interpreted as an escape, i.e., a single backslash.
1赞 Alex 11/7/2023
您还可以使用不带反向引用的简单字符串替换:rubyapi.org/3.3/o/string#method-i-5B-5D-3Ds = "1 \\ 2"; s["\\"] = "\\\\"; s #=> "1 \\\\ 2"
0赞 Nicola Mingotti 11/7/2023
这是最好的!它唯一的问题是它只匹配第一次出现。
1赞 Alex 11/7/2023
正确,就像方法一样。我猜你想要.您也可以在不需要额外转义的情况下使用块形式subgsub"1 \\ 2 \\ 3".gsub("\\") { "\\\\" }
0赞 Nicola Mingotti 11/7/2023
我想说的是,当我想要一个快速而简单(转义只发生一次)字符串替换时,对我来说,使用字符串参数和块绝对是解决方案。谢谢!gsubsub