Ruby上的Ruby - 跨越两行文本的正则表达式

时间:2011-02-28 22:32:27

标签: ruby regex cross-platform

在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

谢谢你,

3 个答案:

答案 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序列吗?