提问人:Nicola Mingotti 提问时间:11/6/2023 更新时间:11/6/2023 访问量:69
Ruby 将 String 中的反斜杠替换为双反斜杠 [duplicate]
Ruby replace backslash with double backslash in a String [duplicate]
问:
我有一个困扰我的小问题。我需要将字符串中的每个反斜杠加倍,例如,如果有一个字符串,我会将其转换为.我不明白为什么下面的代码会失败。你能帮忙吗?请不要告诉我拆分为字符并操作列表元素然后加入;)我需要知道这是否是一个错误,或者我是否遗漏了什么。再见1 \ 2
1 \\ 2
sub
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
答:
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
正确,就像方法一样。我猜你想要.您也可以在不需要额外转义的情况下使用块形式sub
gsub
"1 \\ 2 \\ 3".gsub("\\") { "\\\\" }
0赞
Nicola Mingotti
11/7/2023
我想说的是,当我想要一个快速而简单(转义只发生一次)字符串替换时,对我来说,使用字符串参数和块绝对是解决方案。谢谢!gsub
sub
评论
s = "\\" ; s.replace("\\","\\\\")