0

我想用 JavaScript 从 iCalendar 文件中读取几个参数。

文件输入如下所示:

开始:事件 DTSTART:20121127T190000Z DTEND:20121127T210000Z DTSTAMP:20121130T185808Z UID:q4sbrtajjol1hlpiijpho5jac0@google.com 创建:20121102T191519Z 描述:1。德甲\, 14. Spieltag \n\nhttp://www.fussball-spielplan. 信息最后修改:20121127T211459Z 位置:德国商业银行竞技场\,法兰克福 序列:10 状态:确认摘要:法兰克福法兰克福 - 1. FSV 美因茨 05 (1:3) 运输:透明 结束:事件

参数标签为:

DTSTART:
DTEND:
DTSTAMP:
UID:
CREATED:
DESCRIPTION:
LAST-MODIFIED:
LOCATION:
STATUS:
SUMMARY:
TRANSP:

我想读取这些参数背后的值。值的长度主要是可变的。

使用 aRegExp非常困难,因为我目前不知道将什么设置为分隔符。 "\n"不起作用,因为所有文本部分都用空格分隔。但是如果我使用空格分隔符"\s",它将在每个单词之后分开,这不是想要的结果,尤其是对于DESCRIPTION:包含较长文本的参数。

我的源代码目前看起来像这样:

file_reader.onload = function (evt) {
document.getElementById("filedrag").textContent = evt.target.result;

Output(
    "<p>File information: <strong>" + file.name +
    "</strong> type: <strong>" + file.type +
    "</strong> size: <strong>" + file.size +
    "</strong> bytes</p>");

var regexp = new RegExp("/DTSTART:(.*?)\s/", "g"); 
var file_content = evt.target.result;
var match, matches = [];

while ((match = regexp.exec(file_content)) != null) {
    matches.push(match.index);
}

alert(matches);
}

任何想法,我怎样才能实现我的想法?

4

2 回答 2

2

在您的代码中,您有

var regexp = new RegExp("/DTSTART:(.*?)\s/", "g"); 

/但是在将字符串传递给构造函数时不需要正则表达式分隔符RegExp- 它将被解释为要匹配的字符。此外,作为一个字符串,任何特殊的正则表达式字符都需要进行双重转义,所以\s应该是\\s.

这是获取每个指定标签的值的一种方法:

var match,
    matches = [],
    tags = 'DTSTART|DTEND|DTSTAMP|UID|CREATED|DESCRIPTION|' +
           'LAST-MODIFIED|LOCATION|STATUS|SUMMARY|TRANSP',
    regexp = new RegExp( '(?:' +  tags + '):([\\s\\S]*?)(?=\\s+(?:' +
                                  tags + '|SEQUENCE|END):)', 'g' );   

while ( match = regexp.exec( file_content ) ) {
    matches.push( match[1] );
}

如果要检索每个标签:值对,请更改match[1]match[0].

以上假设每个标签前至少有一个空格或换行符。
它还假设空格后跟标签名称后跟 a:不会出现在任何标签的值中。

[\\s\\S]用于代替,.以便换行符可以包含在标记的值中。

上面没有捕获SEQUENCE标签的值,因为它没有在列表中指定。
如果要捕获它,只需将其添加到并tags从中删除即可。regexp'|SEQUENCE|END):)''|END):)'

或者:

var m,
    params = {},
    rex = /([A-Z-]+):([\s\S]*?)(?=\s+[A-Z-]+:|$)/g;   

while ( m = rex.exec( file_content ) ) {
    params[ m[1] ] = m[2];
}

console.log( params["DTSTART"] );    // 20121127T190000Z
于 2013-02-16T17:11:03.293 回答
1
var params={};
fileContent.replace(/([\w-]+):([^:]+)\s/g,function($0,$1,$2){params[$1]=$2;});

上面的正则表达式假设:

  • 您的参数是单个单词(没有空格),后跟一个冒号([\w-]+):
  • 值不包含冒号([^:]+)

如果您的值(例如说明文本)可以包含冒号,那么您需要更具体地了解参数(参见@MikeM 的答案)。

现场演示:http: //jsfiddle.net/zhsLJ/

于 2013-02-16T17:46:00.393 回答