我想用JavaScript读取iCalendar文件中的几个参数。
文件输入如下:
BEGIN:VEVENT DTSTART:20121127T190000Z DTEND:20121127T210000Z DTSTAMP:20121130T185808Z UID:q4sbrtajjol1hlpiijpho5jac0@google.com创建时间:20121102T191519Z描述:1。 Bundesliga \,14。Spieltag \ n \ nhttp://www.fussball-spielplan。 info最后修改:20121127T211459Z位置:德国商业银行竞技场\,法兰克福序列号:10状态:已确认摘要:法兰克福Eintracht - 1. FSV Mainz 05(1:3)TRANSP:TRANSPAREND END:VEVENT
参数标记为:
DTSTART:
DTEND:
DTSTAMP:
UID:
CREATED:
DESCRIPTION:
LAST-MODIFIED:
LOCATION:
STATUS:
SUMMARY:
TRANSP:
我想阅读这些参数背后的值。 值的长度大多是可变的。
使用RegExp
非常困难,因为我目前不知道要将其设置为分隔符。
"\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);
}
任何想法,我如何实现我的想法?
答案 0 :(得分:2)
在您的代码中
var regexp = new RegExp("/DTSTART:(.*?)\s/", "g");
但是将字符串传递给/
构造函数时不需要正则表达式分隔符RegExp
- 它将被解释为要匹配的字符。此外,作为一个字符串,任何特殊的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]
。
以上假设每个标签前至少有一个空格或换行符
它还假定后跟标记名称后跟:
的空格不会出现在任何标记的值中。
[\\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
答案 1 :(得分:1)
var params={};
fileContent.replace(/([\w-]+):([^:]+)\s/g,function($0,$1,$2){params[$1]=$2;});
上述正则表达式假定:
([\w-]+):
([^:]+)
如果您的值(例如DESCRIPTION文本)可以包含冒号,那么您需要更具体地了解参数(参见@MikeM的回答)。