У меня есть метод, который сканирует обычный текст (особенно в формате QIF), ища даты, которые появляются после 'D' в новой строке:
dates = "D2009-11-12\nPApple Store\nMSnow Leopard\nD2009-11-13\nPApple Store\nMiMac".scan(/^\s*D"?(.+?)[\r\n?|\n]/m)
# => [["2009-11-12"], ["2009-11-13"]]
"D2009-11-12\r\nPApple Store\r\nMSnow Leopard\r\nD2009-11-13\r\nPApple Store\r\nMiMac".scan(/^\s*D"?(.+?)[\r\n?|\n]/m)
# => [["2009-11-12"], ["2009-11-13"]]
Это хорошо работает в различных форматах, но я только что столкнулся с проблемой с файлами, сгенерированными из Quicken на Mac, который сохраняет их в формате MacOS Classic. То есть строки разделяются с помощью возврата каретки, а не новых строк (т. Е. «\ R», а не «\ n» или «\ n \ r»).
"D2009-11-12\rPApple Store\rMSnow Leopard\rD2009-11-13\rPApple Store\rMiMac".scan(/^\s*D"?(.+?)[\r\n?|\n]/m)
# => [["2009-11-12"]]
Проблема заключается в том, что многострочный код регулярного выражения в Ruby не считает '\ r' разделителем новой строки (что, разумеется, не так).
Каков наилучший способ поддержки первоначального анализа, а также обработки этих файлов Mac OS Classic?
Должен ли я заменить все вхождения '\ r' на '\ n \ r' и, если да, как мне поступить так, поскольку вызов string.gsub(/\r/, '\n\r')
приведет к замене \n\r\r
в некоторых сценариях , Я хотел бы вызвать string.gsub(/[^\n]\r/, '$1\n\r')
, но это не поддерживается методом gsub
.