我认为这段代码可行,但正则表达式与\ 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
Run Code Online (Sandbox Code Playgroud)
除了替代方案,我很高兴知道我做错了什么(为了方便我学习).:)
Ian*_*han 164
返回str的副本,其中删除了前导和尾随空格.
例如
" hello ".strip #=> "hello"
"\tgoodbye\r\n".strip #=> "goodbye"
Run Code Online (Sandbox Code Playgroud)
使用gsub
string = string.gsub(/\r/," ")
string = string.gsub(/\n/," ")
Run Code Online (Sandbox Code Playgroud)
loc*_*red 35
通常当我处理剥离\ r或\n时,我会通过做类似的事情来寻找两者
lines.gsub(/\r\n?/, "\n");
Run Code Online (Sandbox Code Playgroud)
我发现根据数据的保存方式(使用的操作系统,使用的编辑器,Jupiter当时与Io的关系),回车后可能有也可能没有换行符.在十六进制模式下看到两个字符看起来很奇怪.希望这可以帮助.
Rôm*_*con 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.
Vik*_*Vik 17
modified_string = string.gsub(/\s+/, ' ').strip
Run Code Online (Sandbox Code Playgroud)
小智 17
如果您使用的是Rails,则有一种squish方法
"\tgoodbye\r\n".squish => "goodbye"
"\tgood \t\r\nbye\r\n".squish => "good bye"
小智 15
lines2 = lines.split.join("\n")
Run Code Online (Sandbox Code Playgroud)
Joe*_*MAR 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
以下怎么样?
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>
Run Code Online (Sandbox Code Playgroud)
要么...
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>
Run Code Online (Sandbox Code Playgroud)
我认为你的正则表达式几乎完成了 - 这就是我要做的:
lines2 = lines.gsub(/[\r\n]+/m, "\n")
Run Code Online (Sandbox Code Playgroud)
在上面,我将 \r 和 \n 放入一个类中(这样它们出现的顺序并不重要)并添加了“+”限定符(以便“\r\n\r\n \r\n" 也会匹配一次,然后将整个内容替换为 "\n")