如何用Ruby删除回车?

时间:2008-11-13 18:00:42

标签: ruby regex

我认为这段代码可行,但正则表达式与\ r \ n不匹配。我已经在十六进制编辑器中查看了我正在阅读的数据并验证了文件中确实存在十六进制D和十六进制模式。

我也尝试过正则表达式/ \ 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

除了替代方案,我很高兴知道我做错了什么(为了方便我学习)。 :)

14 个答案:

答案 0 :(得分:159)

使用String#strip

  

返回str的副本,其中删除了前导和尾随空格。

e.g

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

使用gsub

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

答案 1 :(得分:35)

通常当我处理剥离\ r或\ n时,我会通过做类似

的事情来寻找它们
lines.gsub(/\r\n?/, "\n");

我发现根据数据的保存方式(使用的操作系统,使用的编辑器,Jupiter当时与Io的关系),回车后可能有也可能没有换行符。在十六进制模式下看到两个字符看起来很奇怪。希望这会有所帮助。

答案 2 :(得分:23)

puts lines时你会得到什么?那会给你一个线索。

默认情况下,File.open会以文字模式打开文件,因此\r\n个字符会自动转换为\n。也许这就是lines始终等于lines2的原因。要防止Ruby解析行结束,请使用rb模式:

C:\> copy con lala.txt
a
file
with
many
lines
^Z

C:\> irb
irb(main):001:0> text = File.open('lala.txt').read
=> "a\nfile\nwith\nmany\nlines\n"
irb(main):002:0> bin = File.open('lala.txt', 'rb').read
=> "a\r\nfile\r\nwith\r\nmany\r\nlines\r\n"
irb(main):003:0>

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

答案 3 :(得分:17)

modified_string = string.gsub(/\s+/, ' ').strip

答案 4 :(得分:15)

lines2 = lines.split.join("\n")

答案 5 :(得分:15)

如果您使用的是Rails,则有一个squish方法

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

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

答案 6 :(得分:14)

"still the same\n".chomp

"still the same\n".chomp!

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

答案 7 :(得分:6)

以下情况如何?

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>

答案 8 :(得分:2)

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

答案 9 :(得分:2)

我认为你的正则表达式几乎已经完成 - 这就是我要做的事情:

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

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

答案 10 :(得分:2)

另一种变体:

lines.delete(" \n")

答案 11 :(得分:1)

您可以使用:

my_string.strip.gsub(/\s+/, ' ')

答案 12 :(得分:1)

lines.map(&:strip).join(" ")

答案 13 :(得分:0)

def dos2unix(input)
  input.each_byte.map { |c| c.chr unless c == 13 }.join
end

remove_all_the_carriage_returns = dos2unix(some_blob)