регулярное выражение для извлечения строки из данных с возможными переносами строк - PullRequest
0 голосов
/ 09 января 2012

Мне нужно сопоставить некоторые ical-данные для каждого регулярного выражения, чтобы изменить сводку со значениями описания для каждого события, и я каким-то образом застрял там.

пример набора данных:

...
SUMMARY: Hello how are you doi
ng? Hope everything is fine?
DESCRIPTION: This is a description.
This: is still the description;
...

Разрывы строк предназначены.Как и ":" и ";"символов в значении.

Теперь мне нужно извлечь значения SUMMARY и DESCRIPTION.

Моя первая попытка была примерно такой:

summary = text.match /(?<=SUMMARY:).+(?=\n[A-Z]+:)/m

Вот ссылка на пример с Rubular (без заглядывания назад кажется, что Rubular не может этого сделать). Он работает для сводки, как и ожидалось, но не для Description.

Сводка

Описание

Ответы [ 3 ]

0 голосов
/ 09 января 2012

Проблема в том, что вы ожидаете \n[A-Z]+: после матча из-за вашего взгляда вперед. Но в вашем случае конец строки следующий.

Таким образом, решение состоит в том, чтобы сделать чередование, ожидая либо того, либо другого

DESCRIPTION:.+(?=\n[A-Z]+:|$)

Смотри на Рубуляр

0 голосов
/ 10 марта 2014

Данные вашего примера не соответствуют RFC 5545, раздел 3.1 Строки содержимого :

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

...
SUMMARY: Hello how are you doi
 ng? Hope everything is fine?
DESCRIPTION: This is a description.
    This: is still the description;
...

является правильным примером.

Развертывание выполняется путем удаления CRLF илинейный пробел, который следует сразу за ... при разборе строки содержимого, НЕОБХОДИМО, чтобы сложенные строки были сначала развернуты

data = File.read("ical-data").gsub!(/\n[\s\t]/, '');
hash = Hash[data.scan(/^(SUMMARY|DESCRIPTION):(.+)/)];
puts "Description:", hash["DESCRIPTION"];
puts "Summary:", hash["SUMMARY"];
0 голосов
/ 09 января 2012

У меня все в порядке:

text = <<EOS
SUMMARY: Hello how are you doi
ng? Hope everything is fine?
DESCRIPTION: This is a description.
This: is still the description;
DATE: this gets selected too :(
EOS

summary = text.match /(?<=SUMMARY:)(?:.+?(?=[A-Z]+:)|.+?$)/m
p summary[0]
# " Hello how are you doi\nng? Hope everything is fine?\n"

description = text.match /(?<=DESCRIPTION:)(?:.+?(?=[A-Z]+:)|.+?$)/m
p description[0]
# " This is a description.\nThis: is still the description;"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...