开发者

Ruby on a Mac -- Regular Expression Spanning Two Lines of Text

开发者 https://www.devze.com 2023-02-14 12:44 出处:网络
On the PC, the following Ruby regular expression matches data. However, when run on the Mac against the same input text file, no matches occur. Am I matching line returns in a way that should work cro

On the PC, the following Ruby regular expression matches data. However, when run on the Mac against the same input text file, no matches occur. Am I matching line returns in a way that should work cross-platform?

data = nil
File.open(ARGV[0], "r") do |file|
    data = file.readlines.join("").scan(/^Name: (.*?)[\r\n]+Email: (.*开发者_如何学编程?)$/)
end

Versions

PC: ruby 1.9.2p135

Mac: ruby 1.8.6

Thank you,

Ben


The problem was the ^ and $ pattern characters! Ruby doesn't consider \r (a.k.a. ^M) a line boundary. If I modified my pattern, replacing both ^ and $ with "\r", the pattern matched as desired.

data = file.readlines.join.scan(/\rName: (.*?)\rEmail: (.*?)\r/)

Instead of modifying the pattern, I opted to do a gsub on the text, replacing \r with \n before calling scan.

data = file.readlines.join.gsub(/\r/, "\n").scan(/^Name: (.*?)\nEmail: (.*?)$/)

Thank you each for your responses to my question.


When going from Windows -> Unix based (MAC) I've had this issue: ^M =? \r\n. The Carriage return gets rendered as a Control-M which may or may not be interpreted correctly by your regexp~


On Unix (OS X is a Unix), end of lines are \n, not \r\n. Putting simply [\n] will work on Mac. To have a cross-platform script, may be you could first replace each \r\n sequence by a \n character?

0

精彩评论

暂无评论...
验证码 换一张
取 消