用于从可能的换行符中提取字符串数据的正则表达式

时间:2012-01-08 20:25:29

标签: ruby regex string icalendar

我需要匹配每个正则表达式的一些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无法做到这一点) 它适用于预期的摘要,但不适用于描述。

Summary

Description

3 个答案:

答案 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]+:|$)

rubular

上查看

答案 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"];