2010-01-12 29 views
1

解析c#-regex中以下塊的最佳做法是什麼?正則表達式解析塊

BLOCK:1 {名稱:蘋果,值:果汁,名稱:XXX,值:YYY,名稱:蘋果,值:果汁}

BLOCK:2 {名稱:香蕉,值:氣味}

BLOCK:3 {}

編輯:靈活的塊

回答

1

下面應該讓你的表達和羣體 '身份證', '名' 和 '價值' 的進一步使用。

BLOCK:(?<id>[0-9+]) { name:(?<name>.+), value:(?<value>.+) } 

然後,您可以換行分割塊,並嘗試解析與正則表達式的每一行,然後再處理他們,如果這是一個成功的比賽。

Regex pattern = new Regex("BLOCK:(?<id>[0-9]+) { name:(?<name>.+), value:(?<value>.+) }"); 
foreach(var line in block.Split('\n')) 
{ 
    Match match = pattern.Match(line); 
    if(match.Success) 
    { 
     Process(match.Groups["value"].Value); 
    } 
} 

編輯
使用類似BLOCK:(?<id>[0-9]+) {(?<inner>.+)}做的第一場比賽。

然後檢查this question進一步信息

+0

對不起。改變了問題。什麼時候我想要一些可擴展的塊名稱和值? –

+0

'。+'是貪婪的,你可能想把它限制爲'\ w +'或'[^,}] +'。至少,把它變成一個非貪婪的'。+?'。 – Kobi

+0

隨意編輯:-)協作網站等 –

1

這可能是過於簡單,要求ANTLR的,但它不會傷害檢查出來以供將來參考。

如果您需要在所有相當複雜的解析什麼,那麼你就不能擊敗http://www.antlr.org/

,當然,它的相關的圖形用戶界面 - http://www.antlr.org/works/index.html

一張照片講千言萬語 - http://www.antlr.org/works/screenshots/editor.jpg

代碼更簡單,調試更簡單...

+0

是的.. MGrammar是類似的項目antlr。 (http://msdn.microsoft.com/en-us/library/dd129519(VS.85).aspx)但我不知道在一個像例子中的小dsl ..我真的需要這個大型圖書館嗎? –