我正在尝试使用正则表达式解析 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/