我需要匹配每个正则表达式的一些ical-data来改变每个事件的描述值的摘要,并且我在那里被卡住了。
样本数据集:
...
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示例的link(没有lookbehind,似乎rubular无法做到这一点) 它适用于预期的摘要,但不适用于描述。
答案 0 :(得分:0)
这对我来说没问题:
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;"
答案 1 :(得分:0)
问题在于,由于你向前看,你希望在比赛结束后\n[A-Z]+:
。但在你的情况下,字符串的结尾是跟随。
因此,解决方案是进行一次预期的交替
DESCRIPTION:.+(?=\n[A-Z]+:|$)
上查看
答案 2 :(得分:0)
您的示例数据不符合RFC 5545, section 3.1 Content Lines:
通过插入一个长行可以在任意两个字符之间分割 CRLF后面紧跟一个线性空白字符 (即SPACE或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"];