2014-03-02 240 views
0

我有類型的字符串分割字符串

2014年2月19日16:21:46139 ERROR queue.TaskQueueEngine - 爲一級未能 決心任務隊列的條目故障檢測任務 java.sql.SQLException:網絡錯誤IOException:連接定時 out:connect 2014-02-19 16:35:48,247錯誤[pool-1-thread-1] cluster.ClusterServiceImpl - 嘗試更新 LastCheckinTime java.sql.SQLException:網絡錯誤IOException: 連接超時:連接

....

我想它按日期時間值,例如分割爲多個子。

日誌[0] = 2014年2月19日16:21:46139 ERROR queue.TaskQueueEngine - 失敗 解決爲第一級故障檢測任務 java.sql.SQLException中任務隊列條目:網絡錯誤IOException :連接超時 出:連接

日誌[1] = 2014年2月19日16:35:48247 ERROR [池-1-螺紋-1] cluster.ClusterServiceImpl - 試圖更新 LastCheckinTime Java時意外的錯誤.sql.SQLException:網絡錯誤IOException: 連接超時:連接

我使用下面的命令

string exLogs = System.IO.File.ReadAllText(@"D:\orion.log"); 
string[] messages = Regex.Split(exLogs,] @"^([0-9]{4})-([0-1][0-9])- 
     ([0-3][0-9])\s([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])"); 

然而,而不是給我個子串它給我

log[0]=2014 
log[1]=02 

等 什麼可能我是做錯了。 謝謝任何​​幫助,將不勝感激。

+0

我可以在每個日期和時間後在您的示例數據中看到一個逗號,如果是這種情況,您可以使用它來分割它逗號並做一些簡單的調整來獲得所需的輸出。 –

+0

@SudhakarTillapudi - 假定日期之後的錯誤日誌文本從不包含逗號。假設那我會很疲倦。 – Oded

回答

1

刪除^表單匹配器的開始。

在正則表達式^意味着比賽必須在字符串或行的開頭開始。

試試這個:

string[] messages = Regex.Split(exLogs, 
    "([0-9]{4}-[0-1][0-9]-[0-3][0-9]\\s(?:[0-1][0-9]|[2][0-3]):[0-5][0-9]:[0-5][0-9])"); 
+0

'''那裏意味着你的正則表達式與預期的非常不同。改用非捕捉paren。 – Oded

+0

謝謝,我編輯了我的帖子 – Ria

+0

感謝這個正則表達式的工作。我還沒有理會正則表達式,並且從正則表達式中提取了正則表達式,卻沒有真正理解什麼是正確的。上面的討論幫助我更好地理解。 – user3370268

-1

有幾件事情都發生在這裏 - 你正在使用許多捕獲的括號,你並不需要 - 這些都使每個捕獲括號的結果要返回作爲一個單獨的結果。大多數這些都不是必需的 - 唯一需要的是用於小時匹配的那個,它可以變成不捕獲的paren。

第二 - 你正在將正則表達式錨定到行首(^) - 這意味着它永遠不會匹配日誌中間的日期。

第三 - 您使用的\s將不匹配多個空格 - 您應該使用\s+

第四 - 拆分不會返回值拆分。

我刪除了大部分捕獲的parens,添加了一小時的no-capture,刪除了開始錨點,並將空間匹配器更改爲\s+

我裹在整個事件中的括號返回日期值,以及:

@"([0-9]{4}-[0-1][0-9]-[0-3][0-9]\s+(?:[0-1][0-9]|[2][0-3]):[0-5][0-9]:[0-5][0-9])" 

這將返回一個數組,其中第一個項目是空的(什麼是第一次約會前),然後將日期,然後是日誌錯誤,然後是日期,然後是日誌錯誤。

0

我認爲這將分兩部分簡單:

首先得到分割​​:

string[] dateAndTime = tex.Split(' '); 

然後得到的日期和時間,每個人用自己的字符串]:

string[] date = dateAndTime[0].Split('-'); 
string[] time = dateAndTime[1].Split(':'); 

我希望這可以幫助