Regex匹配2个重复值之间的所有值
Regex Matching everything between 2 repeating values
我正在制作一个提醒应用程序,我希望能够支持iCalender导入。这就是为什么我希望能够提取事件。这是iCalender:中事件的基本格式
BEGIN:VEVENT
......
......
END:VEVENT
所有这些事件都在一个文件中,所以我会有一个像这样的大列表:
BEGIN:VEVENT
......
......
END:VEVENT
BEGIN:VEVENT
......
......
END:VEVENT
这些事件将有一个开始日期和一个结束日期
BEGIN:VEVENT
......
DTSTART;VALUE=DATE:20160402
DTEND;VALUE=DATE:20160403
......
END:VEVENT
当试图仅提取事件时,它并不总是相同的格式。开始日期和结束日期可以在其他特定字段之前或之后。
目前我有:
/BEGIN:VEVENT['s'S]*?DTSTART;VALUE=DATE:20160402['s'S]*?END:VEVENT/
然而,这不仅仅与事件本身匹配,它从BEGIN:VEVENT
的第一个匹配开始匹配,匹配到日期为止的所有内容,然后在下一个END:VEVENT
完成匹配。
因此,在一些排名靠后的事件中,试图与之匹配的事件包括许多其他事件。有没有一种方法可以匹配DTSTART;VALUE=DATE:
,只匹配上一个最近的BEGIN:VEVENT
和下一个END:VEVENT
,只提取当天的单个事件?
这个问题可以用一个经过回火的贪婪令牌来解决,该令牌可以用来获得文本中两个子字符串之间可能的最小窗口。由于文本是多行的,因此不能使用.
原子来匹配任何字符,因此需要使用[^]
或['s'S]
。
所以,使用
/BEGIN:VEVENT((?:(?!'b(?:END|BEGIN):VEVENT'b)['s'S])*DTSTART;VALUE=DATE:20160402['s'S]*?)END:VEVENT/g
查看regex演示
(?:(?!'b(?:END|BEGIN):VEVENT'b)['s'S])*
部分匹配不是BEGIN:VEVENT
和END:VEVENT
的任何文本(由于'b
单词边界而作为整个单词)。
var re = /BEGIN:VEVENT((?:(?!'b(?:END|BEGIN):VEVENT'b)['s'S])*DTSTART;VALUE=DATE:20160402['s'S]*?)END:VEVENT/g;
var str = 'BEGIN:VEVENT'n......'n......'nEND:VEVENT'nBEGIN:VEVENT'n......'n......'nEND:VEVENT'nThese events will have a start date and an end date'n'nBEGIN:VEVENT'n......'nDTSTART;VALUE=DATE:20160402'nDTEND;VALUE=DATE:20160403'n......'nEND:VEVENT';
var res = [];
while ((m = re.exec(str)) !== null) {
res.push(m[0]);
}
document.body.innerHTML = "<pre>" + JSON.stringify(res.map(x => x.replace(/'r?'n/g, "<br/>")), 0, 4) + "</pre>";
请注意,['s'S]*?
也可以替换为上述回火贪婪令牌,但似乎没有必要,因为VEVENT块是良好形式的,并且没有嵌套的VEVENT区块。如果存在嵌套的VEVENT块,则应将['s'S]*?
替换为缓和贪婪令牌。
相关文章:
- 尝试在一个对象的值和一个对象数组之间进行匹配
- 正则表达式和 javascript:匹配数字后跟空格和大写字母之间的所有内容
- 与冒号(不包括冒号)之间的正则表达式单词匹配
- Javascript Regex匹配两个字符串之间的子字符串,但子字符串可以包含DOT(.)
- RegEx匹配两种模式之间的所有内容(javascript)
- Regex匹配2个重复值之间的所有值
- 如何在字符之间进行匹配,但不将它们包含在结果中
- 匹配所有字符减去尾部空白,然后匹配大括号之间的字符
- 在 JavaScript 代码中的注释字符串之间匹配文本
- 如何在没有令牌的两个令牌之间匹配字符串
- 在空格之间匹配单个单词的长度
- 用javascript中的regex在另外两个字符串之间匹配一个字符串
- CSS -如何在两个元素之间匹配class(一个动态的和一个静态的)
- 在JavaScript中查找两个JSON数组之间匹配的JSON项,并将CSS应用于UL列表中的匹配项
- Regex在标签之间匹配文本太贪婪了
- JS在两个数组之间匹配数据
- 在两个对象数组之间匹配特定属性,然后将值插入到一个对象中
- 用于在两个其他字符串之间匹配字符串的正则表达式
- 'Hamming'javascript测试(Exercism)-在两个字符串之间匹配字母
- Js正则表达式在两组分隔符之间匹配,这可能会出现很多次