Ruby 在字符串中用双反斜杠替换反斜杠

问题描述 投票:0回答:1

我有一个小问题困扰着我。我需要将字符串中的每个反斜杠加倍,例如,如果有一个字符串

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
ruby string substitution backslash
1个回答
0
投票

请注意,

\\
被解释为转义符,即单个反斜杠。

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

反向引用前面通常有一个额外的反斜杠。例如,如果您想编写反向引用

\&
来替换双引号字符串文字,则需要编写
"..\\&.."

如果你想在

\&
中写入一个非反向引用字符串
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"
© www.soinside.com 2019 - 2024. All rights reserved.