Javascript 在2个重复值之间匹配所有内容的正则表达式
我正在制作一个提醒应用程序,我希望能够支持iCalender导入。这就是我希望能够提取事件的原因。这是ICAL中事件的基本格式:Javascript 在2个重复值之间匹配所有内容的正则表达式,javascript,regex,icalendar,Javascript,Regex,Icalendar,我正在制作一个提醒应用程序,我希望能够支持iCalender导入。这就是我希望能够提取事件的原因。这是ICAL中事件的基本格式: BEGIN:VEVENT ...... ...... END:VEVENT 所有这些事件都在一个文件中,因此我将有一个如下的大列表: BEGIN:VEVENT ...... ...... END:VEVENT BEGIN:VEVENT ...... ...... END:VEVENT 这些事件将有开始日期和结束日期 BEGIN:VEVENT ...... DTST
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/
但是,这不仅仅与事件本身匹配,它从第一次匹配开始匹配,匹配所有内容直到日期,然后在以下结束:VEVENT
处完成匹配
因此,在下面的一些事件中,试图匹配它们的列表包括许多其他事件。有没有办法匹配
DTSTART;VALUE=DATE:
并且只有前一个最近的BEGIN:VEVENT
和后一个END:VEVENT
仅用于提取当天的单个事件?可以使用一个标记来解决问题,该标记可用于获取文本中两个子字符串之间可能的最小窗口。由于文本是多行的,因此不能使用
atom来匹配任何字符,因此需要使用[^]
或[\s\s]
所以,使用
/BEGIN:VEVENT((?:(?!\b(?:END|BEGIN):VEVENT\b)[\s\S])*DTSTART;VALUE=DATE:20160402[\s\S]*?)END:VEVENT/g
看
(?:(?!\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\n根:VEVENT\n……\n……\nEND:VEVENT\n这些事件将有一个开始日期和一个结束日期\n\nbein:VEVENT\n……\nDTSTART;值=日期:20160402\n趋势;值=日期:20160403\n……\n日期:VEVENT';
var-res=[];
while((m=re.exec(str))!==null){
res.push(m[0]);
}
document.body.innerHTML=”“+JSON.stringify(res.map(x=>x.replace(/\r?\n/g,“
”),0,4)+”代码>好的,在这里-不,我没办法弄明白,我对正则表达式非常缺乏经验,哇,非常感谢,太棒了!非常感谢您的解释,这是一个非常聪明的方法。因此,如果我理解(?!\b(?:END | BEGIN):VEVENT\b)基本上是说,如果我的BEGIN:VEVENT后面跟有END:VEVENT或BEGIN:VEVENT,但它们之间没有DTSTART,那么就停止捕获了?该标记匹配到第一个DTSTART之前不是BEGIN:VEVENT
和END:VEVENT
的任何文本;值=日期:20160402
。因此,如果DTSTART
位于另一个VEVENT块中,将匹配相应的BEGIN:VEVEVENT
。您可以在令牌的负前瞻部分中添加一些其他选项,以使其与DTSTART
不匹配,例如(?!\b(?:END | BEGIN):VEVENT\b | DTSTART;VALUE=DATE:20160402)
-不确定它是否工作得更快。