2012-12-25 119 views
3

,我有以下數據:正則表達式,大括號以外的字符匹配{}

int time="1356280261" 
char value="3000" 

bankLine { 
    char value="3000" 
    char currency="EUR" 
    int time="1356280261" 
} #bankLine 

我遞歸解析這些數據,並只想匹配塊分別外的2個變量。

我確實有這個正則表達式匹配變量

/(?:char|int)\s*([A-z0-9]*)\s*=\s*"(.*)"/ 

然而,正則表達式塊內的所有事件相匹配了。

如何僅匹配前兩個變量並忽略bankLink-block內的所有變量?

+0

什麼實現? PHP? JavaScript的? –

回答

3

這是一個有點hackish,但你可以嘗試添加負先行,如:

/(?:char|int)\s*([A-z0-9]*)\s*=\s*"(.*)"(?![^{]*\})/ 
             ^^^^^^^^^^^ 

這是假定所有括號是平衡的,幸運的嵌套結構不應該的問題(而通常它會,在類似的問題),因爲你正在尋找案件外面括號。

向前看是基於這樣的觀察:如果遇到沒有遇到開放大括號的大括號,那麼我們可以合理地認爲我們在大括號內。

有人試圖擴大這種方式,以包括在之後的否定外觀,但不幸的是大多數實現不支持可變長度lookbehinds。

編輯:

如在下面的評論中討論,這些修補程序建議:

/(?:char|int)\s*([A-Za-z0-9]*)\s*=\s*"([^"]*)"(?![^{]*\})/ 
        ^^^    ^^^^^ 
+0

+1,但我將'A-z'改爲'A-Za-z',因爲ASCII'Z'和ASCII'a'之間有一些你不想匹配的非字母字符。 –

+0

@TimPietzcker - 謝謝,Tim。我剛剛從他的問題中貼上正則表達式來向他展示它的不同之處,但這是一個很好的觀點。我也會編輯他的問題。 –

+0

好主意。另外,'「([^」] *)「'可能會比'」(。*)「'更好,但是由於似乎每行至多有一個鍵/值對,並且該dotall模式不是這不是什麼大問題 –

0

看看這樣的事情對你的作品:

^(?:char|int)[^\n\r]*?$ 

或者只是把一個^在你的表情前

0

這可能不是最好的解決辦法,但我認爲這會爲你的情況下工作:

/^(int|char).*$/ 

的原因是,你聲明的bankLine塊內縮進。那就是我們在這裏利用的。我們簡單地匹配以int或char開始的所有行,這些行在開始時沒有任何空格。