2009-11-10 85 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);