在c#中从字符串中提取值

本文关键字:提取 字符串 | 更新日期: 2023-09-27 18:09:39

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

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

我只想取控件。因此,是否有一种方法可以从上面的字符串中检索到包含[127232, 127235, 127236]的数组?

在c#中从字符串中提取值

实现这一点的一种方法是使用正则表达式,它确实引入了一些复杂性,但可以通过一点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

试试这个(假设你的字符串命名为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(...)最终将搜索项添加到返回列表

我的头试试这个(它是快速和肮脏的),假设你想要搜索的文本是在变量'text':

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

第一行将所有数字拆分为列表中的单独项,它还拆分出许多空字符串,第二行删除空字符串,留下三个数字的列表。如果您想将其转换回数组,只需在末尾添加以下行:

        var numberArray = numbers.ToArray();

是的,方法存在。我想不起它的简单方法,但是要对字符串进行解析以提取这些值。下面是它的算法:

  1. 查找字符串中的单词"Control"及其结尾
  2. 查找
  3. 后的一组数字
  4. 按int提取数字。解析或TryParse
  5. 如果不是字符串的结尾-转到第一步

这个算法的实现几乎是原始的…)

这是最简单的实现(你的字符串是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 ++;
    }