如何使用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);