2011-09-23 25 views
0

我有以下字符串,我想从检索一些值:提取值

============================ 
Control 127232: 
map #;- 
============================ 
Control 127235: 
map $;NULL 
============================ 
Control 127236: 

我想只需要控制。因此,有没有一种方法可以从上面的字符串中检索到一个包含如[127232, 127235, 127236]的数组?

回答

2

试试这个(假设你的字符串被命名为S和每一行与\ n制造):

List<string> ret = new List<string>(); 
foreach (string t in s.Split('\n').Where(p => p.StartsWith("Control"))) 
    ret.Add(t.Replace("Control ", "").Replace(":", "")); 

ret.Add(...)部分是不优雅,但工程...

编辑:
如果你想要一个阵列使用string[] arr = ret.ToArray();

SYNOPSYS:
我看你真的是一个新手,所以我试图解释:

  • s.Split('\n')创建从阵列中只有一个字符串的String [](字符串中的每一行)
  • .Where(...)部分提取先从控制
  • foreach一部分通过返回数组导航采取一个串在一个时间
  • t.Replace(..)削减不必要的串出
  • ret.Add(...)终于增加了搜索物品进入回报列表
+0

嗯,这不会存储到变量? –

+0

@ user866800:是的,进入'List ret'。如果你想要一个数组看看我编辑过的帖子。 – Marco

3

实现此目的的一种方法是使用正则表达式,这会引入一些复杂性,但会给出您想要的一个小LINQ的答案,以获得较好的度量。

开始使用正则表达式来捕捉,一个组内,你想要的数据:

var regex = new Regex(@"Control\s+(\d+):"); 

这将查找文本字符串“控制”,随后由一个或多个空格字符,后面跟着一个或更多的数字(在一个捕获组中)后跟一个字符串“:”。

然后捕获从使用正则表达式的输入上述定义的匹配:

var matches = regex.Matches(inputString); 

然后,使用位LINQ的可以转动这对阵列

var arr = matches.OfType<Match>() 
       .Select(m => long.Parse(m.Groups[1].Value)) 
       .ToArray(); 

现在arr是一个数组long只包含数字。

活生生的例子在这里:http://rextester.com/rundotnet?code=ZCMH97137

+0

对不起,这对我来说似乎太复杂了:( –

+2

@user - 那么你需要从一个简单的问题开始,也许是一本关于C#的初学者书。 – Jamiec

+0

@ user866800阅读关于LINQ和正则表达式。需要学习,既强大又有帮助,保证长时间节省你的时间和精力 –

0

是,该方式中存在。我不记得一个简单的方法,但字符串将被解析以提取这个值。接下来是它的算法:

  1. 查找字符串中的“控制”一词及其最终
  2. 查找的数字组词后int.parse或
  3. 提取号码的TryParse
  4. 如果没有所述字符串的末尾 - 转到步骤一个

实现该算法的几乎是原始..)

这是最简单的小鬼lementation(你的字符串是STR):

int i, number, index = 0;   
    while ((index = str.IndexOf(':', index)) != -1) 
    { 
     i = index - 1; 
     while (i >= 0 && char.IsDigit(str[i])) i--; 
     if (++i < index) 
     { 
      number = int.Parse(str.Substring(i, index - i)); 
      Console.WriteLine("Number: " + number); 
     } 
     index ++; 
    } 

使用LINQ对这样一个小的操作是值得怀疑的。

+0

你能演示一个例子吗? –

+0

在我看来,代码的可读性和简单性应该胜过所有代码优化除了优化之外的情况,处理能力也比开发时间便宜 – ANeves

+0

对我而言,带有注释的普通简单算法的可读性不仅仅在于这样的神奇代码:列表 ret =新列表(); foreach(string s in s.Split('\ n')。其中(p => p.StartsWith(“Control”))) ret.Add(t.Replace(“Control”,“”).Replace “:”,“”)); – Vasya

1

关闭我的头顶试试这个(这是快速和肮脏的),假设你要搜索的文字是在变量“文本”:

 List<string> numbers = System.Text.RegularExpressions.Regex.Split(text, "[^\\d+]").ToList(); 
     numbers.RemoveAll(item => item == ""); 

第一行打出所有的数字变成单独的项目在列表中,它也分裂出大量的空字符串,第二行删除空的字符串给你留下三个数字的列表。如果你想要将其转换回数组,只需将以下行添加到末尾:

 var numberArray = numbers.ToArray();