该字符串源自以下内容的返回值:
> msg = imap.uid_fetch(uid, ["RFC822"])[0].attr["RFC822"]
在控制台中,如果我键入msg,则会显示一个带有双引号的长字符串,并且\ r \n分隔每行:
> msg "Delivered-To: email@test.com\r\nReceived: by xx.xx.xx.xx with SMTP id;\r\n"
如果我将其中一部分与正则表达式匹配,则返回值为\ r \n:
> msg[/Delivered-To:.*?\s+Received:/i] => "Delivered-To: email@test.com\r\nReceived:"
如果我将字符串保存到文件中,请将其读回并与相同的正则表达式匹配,我得到\n而不是\ r \n:
> File.write('test.txt', msg) > str = File.read('test.txt') > str[/Delivered-To:.*?\s+Received:/i] => "Delivered-To: email@test.com\nReceived:"
当字符串保存到文件时,\ r \n是否转换为\n?有没有办法将字符串保存到文件中,在没有修改行结尾的情况下将其读回?
这在IO.new文档中有所介绍:
必须单独使用以下模式,以及上面提到的一种或多种模式.
"b" Binary file mode Suppresses EOL <-> CRLF conversion on Windows. And sets external encoding to ASCII-8BIT unless explicitly specified. "t" Text file mode
换句话说,Ruby与许多其他语言一样,可以感知它所处的操作系统,并且在文本模式下读取/写入文件时会自动在"\ r \n"< - >"\n"之间转换行尾.使用二进制模式以避免转换.
str = File.read('test.txt')
更好的做法是使用读取文件foreach
,这样就不需要关心行尾; 你会分别获得每一行.另一种方法是使用readlines
,但是它使用啜饮,这对于大文件来说可能非常昂贵.
此外,如果您正在处理邮件文件,我强烈建议您使用写入的内容而不是编写自己的文件.该邮件的宝石就是这样的一个包,是预先建立和行之有效的.