2011-09-17 146 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