我认为这段代码可行,但正则表达式与\ r \n不匹配.我已经在十六进制编辑器中查看了我正在阅读的数据并验证了文件中确实存在十六进制D和十六进制A模式.
我也尝试过正则表达式/\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
除了替代方案,我很高兴知道我做错了什么(为了方便我学习).:)
使用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");
我发现根据数据的保存方式(使用的操作系统,使用的编辑器,Jupiter当时与Io的关系),回车后可能有也可能没有换行符.在十六进制模式下看到两个字符看起来很奇怪.希望这可以帮助.
你做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
.
modified_string = string.gsub(/\s+/, ' ').strip
如果您使用的是Rails,则有一种squish
方法
"\tgoodbye\r\n".squish => "goodbye"
"\tgood \t\r\nbye\r\n".squish => "good bye"
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
以下怎么样?
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>