2010-10-12 87 views
1

如果我有一系列具有此基礎格式字符串:解析在C#中嵌套的文本

"[id value]"//id and value are space delimited. id will never have spaces 

然後,他們可以被嵌套這樣的:

[a] 
[a [b value]] 
[a [b [c [value]]] 

所以每個項目可以有0個或1個值條目。

解析這種格式的最佳方法是什麼?我只是使用像string.Split()或string.IndexOf()或有更好的方法?

+2

可以是ID或值包含'['或']'? – 2010-10-12 07:31:11

+0

您是在代碼中創建這個字符串還是來自其他地方? – TalentTuner 2010-10-12 07:33:13

+1

'[a值[b [c值] [d值]]]是否有效? – 2010-10-12 09:03:04

回答

2

split和indexof方法沒有錯,它們存在於字符串解析中。 下面是您的案例的示例:

 string str = "[a [b [c [d value]]]]"; 

     while (str.Trim().Length > 0) 
     { 
      int start = str.LastIndexOf('['); 
      int end = str.IndexOf(']'); 

      string s = str.Substring(start +1, end - (start+1)).Trim(); 
      string[] pair = s.Split(' ');// this is what you are looking for. its length will be 2 if it has a value 

      str = str.Remove(start, (end + 1)- start); 
     } 
+0

對於(高級)字符串解析,存在「Split」和「IndexOf」存在,只要獵槍存在用於在腳下射擊自己。 ;-)但是我真的很喜歡你的代碼,只要值不包含空格就可以工作(儘管它非常低效)。 – 2010-10-12 09:01:21

2

有點遞歸和分裂會工作,主要是使用遞歸,它會讓它變得容易多了。你的輸入語法看起來有點像LISP :)

Parsing a, split, no second part. done. 
Parsing a [b value]. has second part, go to the beginning. 
... 

你明白了。

0

簡單的拆分應該工作 每ID,有一個支架[
所以,當你分割的字符串您有正支架所以N-1 ID(S),其中最後元素包含該值。

1

Regex總是一個不錯的解決方案。

string test = "[a [b [c [value]]]"; 
Regex r = new Regex("\\[(?<id>[A-Za-z]*) (?<value>.*)\\]"); 
var res = r.Match(test); 

然後你就可以得到價值(這是[B [C [值]第一次迭代後),直到比賽失敗再次應用相同的。

string id = res.Groups[1].Value; 
string value = res.Groups[2].Value; 
+1

正則表達式並不總是一個很好的解決方案。 「哦,我可以用正則表達式解決這個問題」 - 現在你有兩個問題。 – Restuta 2010-10-12 07:56:12

+0

那麼,解決方案是什麼問題(甚至是兩個問題)?我認爲它比任何拆分操作都更清晰。 – testalino 2010-10-12 08:04:10

+0

您認爲,但不會有其他開發人員維護此功能。斯普利特也不好。 – Restuta 2010-10-12 08:16:53