我正在尝试使用JavaScript Regex从文件中提取子字符串。这是文件中的一个切片:
DATE:20091201T220000
SUMMARY:Dad's birthday
我要提取的字段是“摘要”。这是方法:
extractSummary : function(iCalContent) {
/*
input : iCal file content
return : Event summary
*/
var arr = iCalContent.match(/^SUMMARY\:(.)*$/g);
return(arr);
}
你需要使用m
flag:
多;将开始和结束字符(^和$)视为处理多行(即匹配每行的开头或结尾(由\ n或\ r分隔),而不仅仅是整个输入字符串的开头或结尾)
还将*
放在正确的位置:
"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^ ^
//-----------------------------------------------------------------------|
function extractSummary(iCalContent) {
var rx = /\nSUMMARY:(.*)\n/g;
var arr = rx.exec(iCalContent);
return arr[1];
}
您需要这些更改:
*
放在括号内。否则,您的匹配组将只包含一个字符。^
和$
。使用全局选项,它们在完整字符串的开头和结尾匹配,而不是在行的开头和结尾。匹配显式换行符。arr[0]
是完全匹配("\nSUMMARY:..."
),下一个索引包含组匹配。你的正则表达式最有可能成为
/\nSUMMARY:(.*)$/g
我喜欢使用的一个有用的小技巧是默认分配匹配数组。
var arr = iCalContent.match(/\nSUMMARY:(.*)$/g) || [""]; //could also use null for empty value
return arr[0];
这样,当你使用arr
时,你不会遇到恼人的类型错误
(.*)
而不是(.)*
将是一个开始。后者只会捕获该行的最后一个字符。
此外,没有必要逃脱:
。
这是你用javascript解析iCal文件的方法
function calParse(str) {
function parse() {
var obj = {};
while(str.length) {
var p = str.shift().split(":");
var k = p.shift(), p = p.join();
switch(k) {
case "BEGIN":
obj[p] = parse();
break;
case "END":
return obj;
default:
obj[k] = p;
}
}
return obj;
}
str = str.replace(/\n /g, " ").split("\n");
return parse().VCALENDAR;
}
example =
'BEGIN:VCALENDAR\n'+
'VERSION:2.0\n'+
'PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n'+
'BEGIN:VEVENT\n'+
'DTSTART:19970714T170000Z\n'+
'DTEND:19970715T035959Z\n'+
'SUMMARY:Bastille Day Party\n'+
'END:VEVENT\n'+
'END:VCALENDAR\n'
cal = calParse(example);
alert(cal.VEVENT.SUMMARY);