2014-03-01 28 views
1

我有一個正則表達式這樣的擴展對象密鑰對的對象:創建JavaScript的

var regex = /(\d\d\/\d\d\/\d\d) (\d\d:\d\d:\d\d): ([^:]+): (.*)/g; 

這是一個正則表達式來閱讀以下字符串,並把它分成幾個對象屬性

27/02/14 23:45:01: Tom: Ja 

隨着上面的正則表達式的一點幫助,我通過此代碼創建一個對象:

var match; 
while(match = regex.exec(chat)) { 
    messages.push({ 
    date: match[1], 
    time: match[2], 
    name: match[3], 
    message: match[4] 
    }); 
} 

有時日期看起來不像dd/mm/yy,而是像dd-mm-yyyydd-mm-yy

無論哪一個匹配我都想解析爲date屬性。但是當添加多個正則表達式來匹配[1]代碼似乎失敗。

+0

所以你在問什麼?一個匹配'dd/mm/yy','dd-mm-yyyy'和'dd-mm-yy'的表達式? –

回答

3

如果我理解正確,那麼當日期始終格式相同,並且您希望能夠接受不同格式的日期時,您的代碼就能正常工作。

試試這個:

var regex = /(\d\d[\/-]\d\d[\/-]\d{2,4}) (\d\d:\d\d:\d\d): ([^:]+): (.*)/g; 

上述正則表達式應該接受正斜槓或破折號(說[\/-]),然後爲一年,接受2首或4個數字(說\d{2,4})。

編輯

下方的評論者提出了很好的建議。如果你想確保分隔符是在兩種情況下是相同的,你可以這樣做,而不是:

var regex = /(\d\d([\/-])\d\d\2\d{2,4}) (\d\d:\d\d:\d\d): ([^:]+): (.*)/g; 

只要注意一下,雖然,第一分隔符現在是一個比賽,所以你必須調整你的代碼創建你的對象。 match[2]現在將是分隔符,所以你必須做這樣的事情:

var match; 
while(match = regex.exec(chat)) { 
    messages.push({ 
     date: match[1], 
     time: match[3], 
     name: match[4], 
     message: match[5] 
    }); 
} 
+1

從技術上講,這也會匹配'dd/mm-yy'(即使這樣的輸入可能不太可能)。要在兩種情況下匹配相同的分隔符,您可以使用捕獲組和反向引用:'(\ d \ d([\/- ])\ d \ d \ 2 \ d {2,4})那麼代碼的其餘部分也必須進行調整)。 –

+0

我不知道它是否是正則表達式,但這似乎返回一個空數組。如果日期格式爲dd/mm/yy,則返回正確的日期格式。 – user3263723