2016-11-04 79 views
1

如何匹配重複組內的重複組?正則表達式:獲取嵌套重複組

例如讓所有有效記錄在日誌文件中:

---: 
TS : 150602000006S 
EC1: 02429.523 
EC2: 05604.110 
--- 
---: 
TS : 150603000006S 
---: 
TS : 150603000006S 
EP1: 3333.523 
--- 

像下面的比賽:

[ 
    [ 
    ['TS ', '150602000006S'], 
    ['EC1', '02429.523'], 
    ['EC2', '05604.110'] 
    ], 
    [ 
    ['TS', '150603000006S'], 
    ['EP1', '3333.523'] 
    ] 
] 

檢索單個記錄性能可與(See on regex101)完成

([A-Z0-9 ]{3,3}): ([0-9SW]+)?([0-9\.SW]{3,})\n 

但是,當將正則表達式放入記錄組(like seen here)時,屬性組將以重複的方式停止匹配。

這是如何正確完成的?

+1

可能不會與正則表達式... – Mena

+0

@Mena爲什麼這不可能? – JasperJ

+0

我並不是說它絕對不可能,但通常,正則表達式對於將文本解析爲給定語法不是上下文很好(例如,針對標記的正則表達式通常是一個非常糟糕的主意)。當嵌套元素和嵌套規則時,正則表達式很快會變得非常麻煩。假設你找到了匹配你的分層記錄的正確方法,那麼表達本身就會很長,可能無法讀取,而且很難維護。通常你會想爲這個實現你自己的解析器。 – Mena

回答

1

爲了保持這種可維護性,我會嘗試將它分成幾個正則表達式。

首先,你想做一些基本的檢查,以確保數據是你期望的格式。我會計算以下每個表達式的出現次數。如果他們不匹配,那就放棄*。一旦你知道這些都是平等的,你可能希望匹配整個字符串與一個模式來將它分成不同的部分,例如,

---:\n.*?---(\n|$) 

這代表一個文字---:跟着一個新行,隨後儘可能少文本越好(*?是懶惰),後跟一個換行或字符串的結尾。您需要使用單行標誌來運行此操作。

這會給你三個匹配你的例子字符串。然後你可以在每個結果匹配上運行你的模式。


*放棄似乎是在這裏最簡單的方式,但它是很難作出任何準確猜測不正確格式的數據。考慮到你前面的例子中,我們有兩個選擇,如果我們想歸這個數據,無論是添加註釋:

---: 
TS : 150602000006S 
EC1: 02429.523 
EC2: 05604.110 
--- 
---: 
TS : 150603000006S 
     // Add a closing tag here? 
---: // Remove this opening tag? 
TS : 150603000006S 
EP1: 3333.523 
--- 

如果我們猜測不正確時,會有什麼後果?在出現錯誤時進行是否有任何好處?它將完全取決於您的應用程序。

+0

我同意將正則表達式分爲兩部分。這與個人記錄匹配,但是,它不處理無效記錄[如此處所示](https://regex101.com/r/Rlw2tn/1)。有這樣的正則表達式的解決方案嗎? – JasperJ

+0

@JasperJ我修改了我的答案。希望能幫助到你。 – Michael