Рубин на Mac - регулярное выражение, охватывающее две строки текста - PullRequest
0 голосов
/ 01 марта 2011

На ПК следующее регулярное выражение Ruby соответствует данным.Однако при запуске на Mac с тем же входным текстовым файлом совпадений не происходит.Совпадаю ли я с возвращением строк способом, который должен работать кроссплатформенно?

data = nil
File.open(ARGV[0], "r") do |file|
    data = file.readlines.join("").scan(/^Name: (.*?)[\r\n]+Email: (.*?)$/)
end

Версии
ПК: ruby ​​1.9.2p135
Mac: ruby ​​1.8.6

Спасибо,
Бен

Ответы [ 3 ]

3 голосов
/ 05 марта 2011

Проблема была в символах ^ и $!Руби не считает \ r (иначе ^ M) границей линии.Если я изменил свой шаблон, заменив ^ и $ на «\ r», шаблон соответствовал желаемому.

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

Вместо того, чтобы изменять шаблон, я решил сделать gsub для текста, заменив \ r на \ n перед вызовом сканирования.

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

Спасибо вам за ваши ответына мой вопрос.

1 голос
/ 01 марта 2011

При переходе из Windows -> на основе Unix (MAC) у меня возникла эта проблема: ^ M =?\ Г \ п .Возврат каретки отображается как Control-M, который может или не может быть правильно истолкован вашим регулярным выражением ~

0 голосов
/ 01 марта 2011

В Unix (OS X - Unix), конец строки \ n, а не \ r \ n.Проще говоря [\ n] будет работать на Mac.Чтобы иметь кроссплатформенный скрипт, может быть, вы могли бы сначала заменить каждую последовательность \ r \ n на символ \ n?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...