红宝石双斜线GSUB问题
我有内容的简单的文本文件:红宝石双斜线GSUB问题
patent-inv
我要去取代专利-INV与第1部分第2部分\\
我做到了在这样的方式:
source_file = IO.read("#{Rails.root}/my_userdata/1.txt")
source_file.gsub!('<<<patent-inv>>>', "part1\\\\part2")
File.open("#{Rails.root}/my_userdata/2.txt", "wb") {|f| f.write source_file }
但在文件中我得到:第一部分 \ 2部分
我尝试了几种方法,但我得到了相同的结果:
source_file.gsub!('<<<patent-inv>>>', "part1\\\\part2") => "part1\part2"
source_file.gsub!('<<<patent-inv>>>', "part1\\\part2") => "part1\part2"
source_file.gsub!('<<<patent-inv>>>', "part1\\part2") => "part1\part2"
谁能帮我找到了这种奇怪的行为?
以下适用于我。你在码头试过了吗?当您输出结果时,它可能会转义。
> a = "<<<patent-inv>>>"
> a.gsub("<<<patent-inv>>>", "part1\\\\part2")
=> "part1\\part2"
你可以看到输出会如何变化puts
和p
编辑之间
> puts a
part1\part2
> p a
"part1\\part2"
> puts a.inspect
"part1\\part2"
这里是因为你想要显示的输出。
1.9.2-p290 :037 > a.gsub!("<<<patent-inv>>>", "part1\\\\\\part2")
=> "part1\\\\part2"
> p a
"part1\\\\part2"
=> "part1\\\\part2"
> puts a
part1\\part2
=> nil
我们知道当改变时4个反斜杠等于2个未反转的反斜杠。因此需要在替换后正确显示4个反斜杠。
是的,在控制台中它工作。但为什么它的工作? ** source_file.gsub!('patent-inv',“part1 \\ part2”)=>“part1 \\ part2”**。但为什么?? – 2012-04-20 07:40:33
因为输出时“\\”未转义为“\”。查看我的编辑。 – Gazler 2012-04-20 07:41:28
好的,这对我来说很明显。但我的问题是关于写入文件。为什么会有意外的行为? – 2012-04-20 07:57:19
编辑纠正我的答案作为一个整体。我误导了puts
在输出时跳过了\
这个符号,因此我认为我没有真正在那里达到目标。但现在我有它的工作。见我的实验:
> str = "patent-inv"
=> "patent-inv"
> str.gsub!('patent-inv', "part1\\\\part2")
=> "part1\\part2"
> str.chars.each { |t| puts t }
p
a
r
t
1
\
p
a
r
t
2
=> "part1\\part2"
> str = "patent-inv"
=> "patent-inv"
> str.gsub!('patent-inv', "part1\\\\\\part2")
=> "part1\\\\part2"
> str.chars.each { |t| puts t }
p
a
r
t
1
\
\
p
a
r
t
2
=> "part1\\\\part2"
基本上我用str.chars.each { |t| puts t }
,看看有什么字符实际上包含的字符串中。正如你所看到的使用正确的模式是part1\\\\\\part2
。
在控制台中它的工作原理和它不能同时工作:** source_file.gsub!('patent-inv',“part1 \\ part2”)**给了我相同的结果**“part1 \\ part2 “**。但为什么?? – 2012-04-20 07:38:55
我改正了我的答案,因为这是完全错误的。我误导了输出。实际上这个字符串只包含一个'\',但是放弃了它,它看起来是双倍的。 – 2012-04-20 08:12:00
尝试
source_file.gsub!('<<<patent-inv>>>', "part1\\\\\\\\part2") => "part1\part2"
=)
也许source_file.gsub!(' >>',“part1 \\\\\\\\\\\\\ part2”)=>“part1 \ part2”??? )) – 2012-04-20 07:57:43
实际上,我测试了我的代码:从文件读取并写入另一个。当你把gsub \\\\\\翻译成\\\\,当你写\\\\翻译成\\ – gayavat 2012-04-20 08:07:06
好的,谢谢你的建议 – 2012-04-20 08:09:26
**为马茨说:**反斜杠在字符串中的特殊含义逃跑,所以你需要 双斜杠。另外,反斜杠在 gsub/sub替换字符串中有特殊含义,所以你需要再次翻倍。那是 之所以你需要4个反斜杠来代替 替换中的每个单个反斜杠。这很奇怪,但很长一段时间它是规格。我不认为 我们可以改变这种行为。您可以改为使用block,例如** printf“b”.gsub(/ b /){'\\'} ** – 2012-04-20 08:30:08