2016-01-13 64 views
0

我有一個CSV在以下約定非標準化,結構化CSV - regexing結構

val1,val2,outerStruct1{valA,valB,innerStruct2{valX, valY},valC},... 

問題是,當我嘗試正則表達式的outerStructure1我得到:

outerStruct1{valA,valB,innerStruct2{valX, valY} 代替:

outerStruct1{valA,valB,innerStruct2{valX, valY},valC}

顯然它返回的第一個}而不是最後一個(有效)一個。我現在正則表達式是:

([a-zA-Z0-9]{0,}\{.*?\})

如何展開它達到適當的右括號?

+0

我正在使用Java,但我想我可以重新格式化其他lang到我的目的。 –

+0

是否'outerStruct1','innerStruct2'部分的結構是靜態的還是會因記錄而異? – JimmyB

+2

吝嗇的重複運算符'*?'專門返回最短匹配。看起來你正在尋找貪婪的重複操作符'*'來代替;但你應該注意不要讓比賽穿越場地邊界。正則表達式並不適合這一點,儘管可以使用正則表達式來實現嵌套級別的有限和硬編碼。 – tripleee

回答

3
\{.*?\}(?=(?:[^{}]*|\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\})*$) 

See it in action

的總體思路是,以檢查你的比賽後,只有平衡的花括號保持直到字符串的結尾。

但是,請注意,此正則表達式不是遞歸的,並且不會處理大於2級的嵌套。

+0

事實上,它對於2個級別更好!它正確匹配val1,val2,o {valA,valB,i {valX,valY},valC,i {i2 {i3 {i4 {i5 {val}},val},val},val,val}},val3 ' –

+0

@aMoosingOne,我的意思是,如果在嵌套> 2之後有另一個值。事實上,我不得不稍微更新它,因爲它只處理0和1級。 – ndn