正则表达式:无法找出表达式来匹配具有单个事件的行并且仅匹配包含特定单词的行

标签 regex sublimetext icalendar

我正在尝试使用 Sublime Text 作为编辑器来清理和合并一些旧的日历文件 (x.ics)。打开文件会得到一个长文件,如下所示。我想删除(即什么都不替换)文件中提及生日的所有条目 (VEVENT),并保留所有其他条目,因此我使用正则表达式作为一种方法。

我设法匹配了从 BEGIN:VEVENT 到 END:VEVENT 的行,但是我无法设置表达式来仅过滤其中包含生日的匹配项/VEVENT。

我现在拥有的是这个表达式:BEGIN:VEVENT(.|\n)*?(Birthday)(.|\n)*?END:VEVENT\n。显然,这不是正确的表达式,因为它匹配从 BEGIN 到 END 就在它找到 Birthday 之后,而不匹配单个 VEVENT。

有人可以帮我找到解决方案吗?将不胜感激!

BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:2009
X-WR-TIMEZONE:Europe/Amsterdam
X-WR-CALDESC:
BEGIN:VEVENT
DTSTART:20110606T170500Z
DTEND:20110614T121000Z
DTSTAMP:20140108T203731Z
UID:CSVConvert0127bd7e37d8feb5e1daaa909729c2ba
CREATED:19000101T120000Z
DESCRIPTION:
LAST-MODIFIED:19700101T000000Z
LOCATION:Amsterdam
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Study
TRANSP:OPAQUE
END:VEVENT
.
.
.
BEGIN:VEVENT
DTSTART;VALUE=DATE:20110704
DTEND;VALUE=DATE:20110705
DTSTAMP:20140108T203731Z
UID:CSVConvert02f7a0b537b60e5601035a356dfd6a06
CREATED:19000101T120000Z
DESCRIPTION:
LAST-MODIFIED:19700101T000000Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Mark's Birthday
TRANSP:TRANSPARENT
END:VEVENT
END:VCALENDAR

最佳答案

我认为你需要添加一个 lookahead 来防止它越界:

BEGIN:VEVENT([\s\S](?!BEGIN:VEVENT))+?Birthday[\s\S]+?END:VEVENT

注意:我不是 ST 用户,不知道它是否支持。

关于正则表达式:无法找出表达式来匹配具有单个事件的行并且仅匹配包含特定单词的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21032018/

相关文章:

mysql - VARCHAR mysql 中的时间长度

calendar - 最标准的日历交换数据格式

.net - .NET中的双向可更新iCal文件

java - .ics 文件中使用的时间格式?

java - 正则表达式以避免特殊字符分割

regex - 在 bash 中检查文件的正则表达式

ios - 仅将字符串的数字粘贴(插入)到标签(IOS)中

c++ - C/C++ 头文件和代码文件中的 ASCII 艺术注释

python - 用于显示/隐藏/切换选项卡的 Sublime Text 2/3 快捷方式

sublimetext3 - 带有 Sublime Text 编辑器的阿拉伯语