gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:56:45 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com