Как получить текст между двумя строками в ruby? - PullRequest
3 голосов
/ 09 августа 2011

У меня есть текстовый файл, содержащий этот текст:

What's New in this Version
==========================
-This is the text I want to get 
-It can have 1 or many lines
-These equal signs are repeated throughout the file to separate sections

Primary Category
================

Я просто хочу получить все между ========================= и Первичная категория и сохранить этот блок текста в переменной.Я думал, что следующий метод сопоставления будет работать, но он дает мне NoMethodError: неопределенный метод `match '

    f = File.open(metadataPath, "r")
    line = f.readlines
    whatsNew = f.match(/==========================(.*)Primary Category/m).strip

Есть идеи?Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 09 августа 2011

f - дескриптор файла - вы хотите сопоставить текст в файле, который вы прочитали в line. Что я предпочитаю делать вместо того, чтобы читать текст в массив (который трудно отразить), это просто читать его в одну строку:

contents = File.open(metadataPath) { |f| f.read }
contents.match(/==========================(.*)Primary Category/m)[1].strip

Последняя строка дает желаемый результат:

-This is the text I want to get \n-It can have 1 or many lines\n-These equal signs are repeated throughout the file to separate sections"
0 голосов
/ 10 августа 2011

Подход, который я выбрал бы, это прочитать строки, выяснить, какие номера строк представляют собой серии знаков равенства (используя Array#find_index), и сгруппировать строки в куски от строки после знаков равенства до строки перед (или двумя строками раньше) следующая партия знаков равенства (возможно, с использованием Enumerable#each_cons(2) и map). Таким образом, мне не нужно много менять, если меняются заголовки разделов.

0 голосов
/ 09 августа 2011

Ваша проблема в том, что readlines дает вам массив строк (по одной на каждую строку), но для используемого вами регулярного выражения требуется одна строка. Вы можете прочитать файл как одну строку:

contents = File.read(metadataPath)
puts contents[/^=+(.*?)Primary Category/m]
# => ==========================
# => -This is the text I want to get
# => -It can have 1 or many lines
# => -These equal signs are repeated throughout the file to separate sections
# =>
# => Primary Category

или вы можете объединить строки в одну строку перед применением регулярного выражения:

lines = File.readlines(metadataPath)
puts lines.join[/^=+(.*?)Primary Category/m]
# => ==========================
# => -This is the text I want to get
# => -It can have 1 or many lines
# => -These equal signs are repeated throughout the file to separate sections
# =>
# => Primary Category
0 голосов
/ 09 августа 2011
f = File.open(metadataPath, "r")
line = f.readlines
line =~ /==========================(.*)Primary Category/m
whatsNew = $1

вы можете рассмотреть возможность уточнения. * Хотя это может быть жадным

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