Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在2个重复值之间匹配所有内容的正则表达式_Javascript_Regex_Icalendar - Fatal编程技术网

Javascript 在2个重复值之间匹配所有内容的正则表达式

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

我正在制作一个提醒应用程序,我希望能够支持iCalender导入。这就是我希望能够提取事件的原因。这是ICAL中事件的基本格式:

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)
-不确定它是否工作得更快。