2009-11-10 86 views
74

它可能看起来很明显提取字符串,但我浪费了太多的时间去得到它的工作...如何使用Javascript正则表达式

我试图提取使用Javascript正则表达式的文件的字符串。下面是从文件切片:

DATE:20091201T220000 
SUMMARY:Dad's birthday 

我想提取领域是总结,所以我想写只返回摘要文本的方法。下面是方法:

extractSummary : function(iCalContent) { 
    /* 
    input : iCal file content 
    return : Event summary 
    */ 
    var arr = iCalContent.match(/^SUMMARY\:(.)*$/g); 
    return(arr); 
} 

清楚,我是一个正则表达式小白:)),你可以解决它吗?感谢

回答

55

您需要使用mflag

multiline;将开始和结束字符(^和$)视为在多行上工作 (即匹配每行 (由\ n或\ r定界)的开始或结尾,而不仅仅是整个输入的开头或结尾字符串)

也把*在正确的地方:

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm); 
//------------------------------------------------------------------^ ^
//-----------------------------------------------------------------------| 
6

(.*),而不是(.)*将是一个开端。后者只会捕获线上的最后一个字符。

而且,没有必要躲避:

64
function extractSummary(iCalContent) { 
    var rx = /\nSUMMARY:(.*)\n/g; 
    var arr = rx.exec(iCalContent); 
    return arr[1]; 
} 

您需要这些变化:

  • *括号内为 上述建议。否则,你的匹配 组将只包含一个 字符。

  • 摆脱^$。使用全局选项,它们匹配整个字符串的开始和结尾,而不是行的开始和结束。相反,显式换行匹配。

  • 我想你想匹配的组(这是什么 在括号内),而不是 全阵列? arr[0]是 充分匹配("\nSUMMARY:...")和 下一索引包含组 匹配。

  • String.match(regexp)是 应该返回一个与 匹配的数组。在我的浏览器中,它没有(Mac上的Safari只返回完整的 匹配项,而不是组),但 Regexp.exec(字符串)工作。

+0

尝试过,但doen'st工作。 – PapelPincel 2009-11-10 15:17:49

+1

我会把它和@barkmadley的'||结合起来[null,null]'因为如果匹配失败,'arr'将为null,并且'arr [1]'会抛出异常 – Kunal 2016-05-05 16:44:05

11

你的正则表达式最有可能想成为

/\nSUMMARY:(.*)$/g 

一个有用的小技巧我喜欢用的是默认分配上匹配的数组。

var arr = iCalContent.match(/\nSUMMARY:(.*)$/g) || [""]; //could also use null for empty value 
return arr[0]; 

这样,当你去使用arr

+1

如果匹配不存在_match_,则返回null – Kunal 2016-05-05 16:41:42

-2

这是你如何解析与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);