2011-12-05 20 views
1

我有这样的代码:如何用C#解析代码。括号中的代码是标准名称

(00)1234567891234(10)1234(3100)12315 

代码括号内是标准的名称,它们总是相同的。但顺序可以不同。 (10)可以是前(00)和代替(3100)可以是(01)

什么是睫状数据的最佳解决方案,如:

(00)1234567891234 
(10)1234 
(3100)12315 

,然后,如果我写

00我会得到1234567891234

10我会得到1234

3100我会得到12315

这样做的最好方法是什么?我如何获得()xx()之间的值?

+2

你有什么试过?数据在键值对之间是否有换行符也不清楚。 – Oded

+0

我尝试用indexOf这是个坏主意。代码没有换行符。 – senzacionale

+2

你看过'String.Split'吗? – Oded

回答

3

试试这个

const string text = "(00)1234567891234(10)1234(3100)12315"; 

    var result = Regex.Matches(text, @"\((\d+)\)(\d+)").Cast<Match>() 
     .Select(x => new {Value = x.Groups[2].Value, Key = x.Groups[1].Value}) 
     .ToDictionary(y => y.Key, x => x.Value); 

    foreach (var r in result) 
    { 
     Console.WriteLine("Key: {0}, Value: {1}", r.Key, r.Value); 
    } 


    /* OUTPUT 
    * 
    * Key: 00, Value: 1234567891234 
     Key: 10, Value: 1234 
     Key: 3100, Value: 12315 
    */ 

    Console.Read(); 

使用LINQ(这似乎是这里优选)在一行中你得到一个Dictionary<string, string>与具有两个属性KeyValue的对象。

+0

非常好!我喜欢这个方法! –

+0

thx的想法。我认为正确的代码是@“\(\ d + \)(\ d +)” – senzacionale

+0

@Aliostad thx用于更新。 – senzacionale

1

非常简单的方法:

string input = "(00)1234567891234(10)1234(3100)12315"; 
string[] lines = input.Split(new [] {"("}, StringSplitOptions.RemoveEmptyEntries); 
foreach(string ln in lines) 
{ 
    string key = ln.Substring(0, ln.IndexOf(')')); 
    string value = ln.Substring(ln.IndexOf(')') + 1); 
} 
1

我不会写代码,你反而会给你一个提示

(00)1234567891234(10)1234(3100)12315

解析上面的字符串基于()可以使用String.Split方法

这会给你以下的数组

00 
1234567891234 
10 
1234 
3100 
12315 

现在你可以对这样的价值,并把它们放在一个Dictionary<String, String>