Ruby双斜杠gsub问题

时间:2012-04-20 07:25:34

标签: ruby-on-rails ruby

我有一个包含内容的简单文本文件:

   patent-inv

我要用 part1 \\ part2 取代 patent-inv

我是这样做的:

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 }

但在文件中我得到了: part1的\第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"

有人可以帮我找出这种奇怪的行为吗?

3 个答案:

答案 0 :(得分:3)

以下适用于我。你在终端试过吗?输出结果时可以取消转义。

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

答案 1 :(得分:2)

编辑纠正我的答案。由于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来查看字符串中实际包含的字符。如您所见,正确的模式是{{1}}。

答案 2 :(得分:1)

尝试

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

=)