ruby - iCalendar 的正则表达式解析(Ruby 正则表达式)

标签 ruby regex icalendar rfc2445 rfc5545

我正在尝试使用正则表达式解析 iCalendar (RFC2445) 输入。

这是输入内容的[简化]示例:

BEGIN:VEVENT
abc:123
def:456
END:VEVENT
BEGIN:VEVENT
ghi:789
END:VEVENT

我想要一个匹配数组:“外部”匹配是每个 VEVENT block ,内部匹配是每个字段:值对。

我试过这个的变体:

BEGIN:VEVENT\n((?<field>(?<name>\S+):\s*(?<value>\S+)\n)+?)END:VEVENT

但考虑到上面的输入,结果似乎只有一个字段用于每个匹配的 VEVENT,尽管 +?在捕获组上:

**Match 1**
field   def:456
name    def
value   456

**Match 2**
field   ghi:789
name    ghi
value   789

在第一场比赛中,我希望有两个字段:abc:123 和 def:456 比赛......

我确定这是一个新手错误(因为我似乎永远都是正则表达式的新手......) - 但也许你能给我指明正确的方向?

谢谢!

最佳答案

您需要将正则表达式拆分为一个匹配 VEVENT 和一个匹配名称/值对。然后,您可以使用嵌套 scan 查找所有出现的地方,例如。 G。

str.scan(/BEGIN:VEVENT((?<vevent>.+?))END:VEVENT/m) do
  $~[:vevent].scan(/(?<field>(?<name>\S+?):\s*(?<value>\S+?))/) do
    p $~[:field], $~[:name], $~[:value]
  end
end

其中 str 是您的输入。这输出:

"abc:1"
"abc"
"1"
"def:4"
"def"
"4"
"ghi:7"
"ghi"
"7"

如果你想让代码更具可读性,我建议你需要'english'并将$~替换为$LAST_MATCH_INFO

关于ruby - iCalendar 的正则表达式解析(Ruby 正则表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13095310/

相关文章:

ruby-on-rails - ruby rails : Bundler could not find compatible versions for gem "json"

Python正则表达式将字符串拆分为数字和文本/符号

javascript - 允许逗号和空格分隔的数字列表的正则表达式

linux - 在 linux 上生成有效的 ical 文件

c - C 中的 Strsep 和 iCalendar 解析

ruby - 如何将有理数格式化为小数?

Linux 上的 Ruby PTY 在没有 EOF 的情况下消失,引发 Errno::EIO

ruby-on-rails - Ruby on Rails RSpec 路由失败

Javascript RegExp 构造函数和文字的不同结果

iCal 订阅的 Outlook 刷新间隔 (webcal ://)