红宝石双斜线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" 

谁能帮我找到了这种奇怪的行为?

+1

**为马茨说:**反斜杠在字符串中的特殊含义逃跑,所以你需要 双斜杠。另外,反斜杠在 gsub/sub替换字符串中有特殊含义,所以你需要再次翻倍。那是 之所以你需要4个反斜杠来代替 替换中的每个单个反斜杠。这很奇怪,但很长一段时间它是规格。我不认为 我们可以改变这种行为。您可以改为使用block,例如** printf“b”.gsub(/ b /){'\\'} ** – 2012-04-20 08:30:08

以下适用于我。你在码头试过了吗?当您输出结果时,它可能会转义。

> a = "<<<patent-inv>>>" 
> a.gsub("<<<patent-inv>>>", "part1\\\\part2")  
=> "part1\\part2" 

你可以看到输出会如何变化putsp编辑之间

> 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个反斜杠。

+0

是的,在控制台中它工作。但为什么它的工作? ** source_file.gsub!('patent-inv',“part1 \\ part2”)=>“part1 \\ part2”**。但为什么?? – 2012-04-20 07:40:33

+0

因为输出时“\\”未转义为“\”。查看我的编辑。 – Gazler 2012-04-20 07:41:28

+0

好的,这对我来说很明显。但我的问题是关于写入文件。为什么会有意外的行为? – 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

+0

在控制台中它的工作原理和它不能同时工作:** source_file.gsub!('patent-inv',“part1 \\ part2”)**给了我相同的结果**“part1 \\ part2 “**。但为什么?? – 2012-04-20 07:38:55

+0

我改正了我的答案,因为这是完全错误的。我误导了输出。实际上这个字符串只包含一个'\',但是放弃了它,它看起来是双倍的。 – 2012-04-20 08:12:00

尝试

source_file.gsub!('<<<patent-inv>>>', "part1\\\\\\\\part2") => "part1\part2" 

=)

+0

也许source_file.gsub!(' >>',“part1 \\\\\\\\\\\\\ part2”)=>“part1 \ part2”??? )) – 2012-04-20 07:57:43

+0

实际上,我测试了我的代码:从文件读取并写入另一个。当你把gsub \\\\\\翻译成\\\\,当你写\\\\翻译成\\ – gayavat 2012-04-20 08:07:06

+0

好的,谢谢你的建议 – 2012-04-20 08:09:26