在PC上,以下Ruby正则表达式匹配数据。但是,当在Mac上针对相同的输入文本文件运行时,不会发生匹配。我是否应该以跨平台工作的方式匹配线路返回?
data = nil
File.open(ARGV[0], "r") do |file|
data = file.readlines.join("").scan(/^Name: (.*?)[\r\n]+Email: (.*?)$/)
end
版本
PC:ruby 1.9.2p135
Mac:红宝石1.8.6
谢谢你,
本
答案 0 :(得分:3)
问题是^和$模式字符! Ruby不认为\ r(a.k.a. ^ M)是一个行边界。如果我修改了我的模式,将^和$替换为“\ r”,则模式会根据需要进行匹配。
data = file.readlines.join.scan(/\rName: (.*?)\rEmail: (.*?)\r/)
我没有修改模式,而是选择在文本上做一个gsub,在调用scan之前将\ r替换为\ n。
data = file.readlines.join.gsub(/\r/, "\n").scan(/^Name: (.*?)\nEmail: (.*?)$/)
感谢各位对我的问题的回答。
答案 1 :(得分:1)
从Windows开始 - >基于Unix(MAC)我遇到过这个问题:^M =? \r\n。 Carriage返回呈现为Control-M,您的正则表达式可能会或可能不会正确解释〜
答案 2 :(得分:0)
在Unix上(OS X是Unix),行尾是\ n,而不是\ r \ n。简单地放[\ n]将适用于Mac。 要拥有跨平台脚本,您可以先用\ n字符替换每个\ r \ n序列吗?