2017-01-11 20 views
0

我會第一個承認我不是最好的正則表達式作家。我試圖在PowerShell中解析日誌文件。日誌文件以日期時間戳開始,可以是多行。一個例子如下:PowerShell中的正則表達式lookahead行爲怪異

2017-01-10T17:52:24.224-05:00 DEBUG (0EC3-018C) < ThisIsAClassName> [blah] log lines are here 
    this is an addition to the previous line 
    So is this at 2017-01  
2017-01-10T17:52:26.224-05:00 DEBUG (0EC3-018C) < ThisIsADiffClassName> [blah] log lines are here 

我的正則表達式看起來像這樣

Timestamp   = "\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}" 
Anything   = "[.|\w]" 
NegativeLookahead = "(?!(" + Timestamp + "))" 
FullRegex   = Timestamp + Anything + NegativeLookahead 

這使我完全投入。我做錯了什麼是爲了按時間戳分行?

+0

你必須*匹配*?你可以用'「(?m)^(?=」+ Timestamp +「)分割」' –

+1

'。[。| \ w]'看起來不對,它不匹配「任何東西」,它只匹配單詞字符,點符號,文字管道符號。 – wOxxOm

+0

而且只有一次。 –

回答

1

我瞭解你處理多行內容。在這種情況下,它是分割更容易而不是比賽

"(?m)^(?=" + Timestamp + ")" 

或者,避免空元素在開始之前,或^之後添加(?!\A)前瞻:

"(?m)(?!\A)^(?=" + Timestamp + ")" 

參見regex demo

enter image description here

這看起來像到底(?m)^(?=\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}),並會匹配啓動的線的任何位置((?m)多改良劑會令行,而不是整個字符串的^比賽開始)後跟一個時間戳模式的時間戳文本將不會被消耗(=不會成爲匹配值的一部分,因此將出現在分割文本中),因爲它在(?=...)積極的超前構造中使用。