从C#中的字符串中提取值

时间:2011-09-23 09:20:23

标签: c#

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

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

我想只接受控制。因此有没有办法从上面的字符串中检索到包含类似[127232, 127235, 127236]

的数组

4 个答案:

答案 0 :(得分:3)

实现这一目标的一种方法是使用正则表达式,它确实会引入一些复杂性,但会给出你需要的答案,只需要一点LINQ就可以了。

从正则表达式开始,在组内捕获所需的数据:

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

这将查找文字字符串“Control”,后跟一个或多个空白字符,后跟一个或多个数字(在捕获组中),后跟文字字符串“:”。

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

var matches = regex.Matches(inputString);

然后,使用一点LINQ,您可以将其转换为数组

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

现在arrlong的数组,只包含数字。

此处的实例:http://rextester.com/rundotnet?code=ZCMH97137

答案 1 :(得分: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')创建一个字符串[](字符串中的每一行)
  • .Where(...)部分从数组中仅提取以Control
  • 开头的字符串
  • foreach部分导航返回的数组,一次取一个字符串
  • t.Replace(..)剪掉不需要的字符串
  • ret.Add(...)最终将搜索到的项目添加到返回列表中

答案 2 :(得分:1)

离开我的头顶试试这个(这很快又很脏),假设你要搜索的文字是变量'text':

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

第一行将所有数字拆分为列表中的单独项目,它还会分割出大量空字符串,第二行会删除空字符串,为您留下三个数字的列表。如果要将其转换回数组,只需将以下行添加到结尾:

        var numberArray = numbers.ToArray();

答案 3 :(得分:0)

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

  1. 在字符串及其结尾处找到“控制”字样
  2. 在单词
  3. 后面找到一组数字
  4. 通过int.parse或TryParse提取数字
  5. 如果不是字符串的结尾 - 转到第一步
  6. 实现这种算法几乎是原始的..)

    这是最简单的实现(你的字符串是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进行这么小的操作是值得怀疑的。