如何使用JavaScript正则expression式提取string
它可能看起来很明显,但我浪费了太多的时间试图让它工作…
我试图从JavaScript正则expression式提取一个子string。 这里是文件的一部分:
DATE:20091201T220000 SUMMARY:Dad's birthday
我想提取的字段是摘要,所以我试图写一个方法,只返回摘要文本。 这里是方法:
extractSummary : function(iCalContent) { /* input : iCal file content return : Event summary */ var arr = iCalContent.match(/^SUMMARY\:(.)*$/g); return(arr); }
显然,我是一个正则expression式noob :))你能解决它吗? 谢谢
你需要使用m
标志 :
多; 将开始和结束字符(^和$)视为处理多行(即匹配每行的开始或结尾(由\ n或\ r定界),而不仅仅是整个inputstring的开头或结尾)
也把*
放在正确的地方:
"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]; }
您需要这些更改:
-
如上所示,将
*
放在括号内。 否则,您的匹配组将只包含一个字符。 -
摆脱
^
和$
。 使用全局选项,它们匹配整个string的开始和结束,而不是行的开始和结束。 匹配显式换行符。 -
我想你想要匹配组(什么是括号内),而不是整个数组?
arr[0]
是完全匹配("\nSUMMARY:..."
),下一个索引包含组匹配。 -
String.match(regexp)应该返回一个包含匹配的数组。 在我的浏览器中,它没有(Mac上的Safari只返回完整的匹配,而不是组),但Regexp.exec(string)的作品。
你的正则expression式很可能是想成为的
/\nSUMMARY:(.*)$/g
我喜欢使用的一个有用的小技巧是默认分配与数组匹配。
var arr = iCalContent.match(/\nSUMMARY:(.*)$/g) || [""]; //could also use null for empty value return arr[0];
这样,当你使用arr
时,你不会感到恼人的types错误
(.*)
而不是(.)*
将是一个开始。 后者将只捕获线上的最后一个字符。
另外,没有必要逃避:
。
这是如何你可以用JavaScriptparsingiCal文件
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);