如何使用Ruby删除回车?

我认为这个代码可以工作,但是正则expression式不会匹配\ r \ n。 我在一个hex编辑器中查看了我正在读取的数据,并确认文件中确实存在hexD和hexA模式。

我也尝试了正则expression式/ \ xD \ xA / m和/ \ x0D \ x0A / m,但是它们也不匹配。

这是我现在的代码:

lines2 = lines.gsub( /\r\n/m, "\n" ) if ( lines == lines2 ) print "still the same\n" else print "made the change\n" end 

除了替代scheme之外,我也很高兴知道自己做错了什么(为了方便我的学习)。 🙂

你做什么时候puts lines ? 这会给你一个线索。

默认情况下, File.open以文本模式打开文件,所以\r\n字符将自动转换为\n 。 也许这就是lines总是等于lines2的原因。 为了防止Rubyparsing行结束使用rb模式:

  C:\>复制conlala.txt
一个
文件
同
许多
线
 ^ Z

 C:\> irb
 irb(main):001:0> text = File.open('lala.txt')。read
 =>“a \ nfile \ n用\ nmany \ nlines \ n”
 irb(main):002:0> bin = File.open('lala.txt','rb')。read
 =>“a \ r \ n文件\ r \ n用\ r \ n \ n \ r \ nlines \ r \ n”
 IRB(主):003:0>

但从你的问题和代码,我看到你只需要打开默认的修改器的文件。 您不需要任何转换,可以使用较短的File.read

使用String#strip

返回删除前导和尾随空白的str的副本。

例如

 " hello ".strip #=> "hello" "\tgoodbye\r\n".strip #=> "goodbye" 

使用gsub

 string = string.gsub(/\r/," ") string = string.gsub(/\n/," ") 

一般来说,当我处理\ r或\ n剥离时,我会通过做类似的事情来寻找两者

 lines.gsub(/\r\n?/, "\n"); 

我发现,根据数据的保存方式(使用的操作系统,使用的编辑器,当时木星与Io的关系),在回车之后可能有也可能不是新行。 看起来很奇怪,你看到在hex模式下的两个字符。 希望这可以帮助。

 modified_string = string.gsub(/\s+/, ' ').strip 
 lines2 = lines.split.join("\n") 

"still the same\n".chomp
要么
"still the same\n".chomp!

http://www.ruby-doc.org/core-1.9.3/String.html#method-i-chomp

如果你使用的是Rails,那就是一种squish方法

"\tgoodbye\r\n".squish => "goodbye"

"\tgood \t\r\nbye\r\n".squish => "good bye"

以下情况如何?

 irb(main):003:0> my_string = "Some text with a carriage return \r" => "Some text with a carriage return \r" irb(main):004:0> my_string.gsub(/\r/,"") => "Some text with a carriage return " irb(main):005:0> 

要么…

 irb(main):007:0> my_string = "Some text with a carriage return \r\n" => "Some text with a carriage return \r\n" irb(main):008:0> my_string.gsub(/\r\n/,"\n") => "Some text with a carriage return \n" irb(main):009:0> 

为什么不以文本模式而不是二进制模式读取文件?

你可以使用这个:

 my_string.strip.gsub(/\s+/, ' ') 
 lines.map(&:strip).join(" ") 

我认为你的正则expression式几乎是完整的 – 这就是我要做的:

 lines2 = lines.gsub(/[\r\n]+/m, "\n") 

在上面,我已经把\ r和\ n放到一个类中(这样,它们可能出现的顺序并不重要),并添加了“+”限定符(这样“\ r \ n \ r \ n \ r \ n“也会匹配一次,整个事情会replace为”\ n“)