2011-09-17 184 views
0

我有以下表述:C#正則表達式匹配偶數括號中表達

KNOWN_TOKEN=((value operator value) operator value) 
      operator OTHER_KNOWN_TOKEN=value 
      operator KNOWN_TOKEN2=(value operator (value operator value)); 

我試圖找到一個C#正則表達式返回我整個表達難分伯仲封閉括號,因爲他們被打開。這意味着,對於KNOWN_TOKEN我只需要((value operator value) operator value),對於OTHER_KNOWN_TOKEN我只需要value,對於KNOWN_TOKEN2我需要(value operator (value operator value))

我嘗試各種口味的(\([^(]+\))但他們只匹配「最低」設置「paranthesis」的,此外,它們匹配一個額外的一個(即用於KNOWN_TOKEN2它們匹配一個額外的結尾括號)。

另外,我在網上發現了一些關於將它做成幾個重複步驟並改變原始文本的提示,但我寧願將它做成一個單一的正則表達式。任何提示?

謝謝!

+0

我,我不是深入到這裏正則表達式中使用(我認爲他們可以回溯的形式),但理論上的正則表達式(那些等效於有限自動機)不能做這樣的事情,我猜如果你爲此使用RegEx它可能會變得相當緩慢。想過爲此做一個簡單的解析器嗎? – Carsten

+0

我真的開始這個'備份'的解決方案,但我認爲這是一個優雅的解決方案。 – dcg

回答

0
Regex reg = new Regex(@"(?<token>[^=]*)=(?<value>\(*value.*)"); 
foreach (Match item in reg.Matches("")) 
{ 
     var token= item.Groups["token"].Value.Trim(); 
     var val= item.Groups["value"].Value.Trim(';'); 
} 

EDITED

+0

你確定這個人在做這個工作嗎? RegexTester說不 - 即使我將值更改爲\ w +(最後一個),它會匹配我放在那裏的儘可能多的開口或右括號......我不認爲這是有效的解決方案 – Carsten

+0

是的,我有一些錯誤。但他的主要目標是「價值」並非令人信服。正確的是'(? [^ =] *)=(? \(*值。*)' – ebattulga

+0

我不認爲這個值代表「價值」,但對於像3或3.4或任何其他令牌 - 仍然是你的正則表達式的最後一部分匹配「(值3)」以及「(值3))」,並且他希望對括號 – Carsten