在c#中从字符串中提取值
本文关键字:提取 字符串 | 更新日期: 2023-09-27 18:09:39
我有以下字符串,我想从中检索一些值:
============================
Control 127232:
map #;-
============================
Control 127235:
map $;NULL
============================
Control 127236:
我只想取控件。因此,是否有一种方法可以从上面的字符串中检索到包含[127232, 127235, 127236]
的数组?
实现这一点的一种方法是使用正则表达式,它确实引入了一些复杂性,但可以通过一点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();
现在arr
是long
的一个数组,其中只包含数字。
这里的实例: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();
是的,方法存在。我想不起它的简单方法,但是要对字符串进行解析以提取这些值。下面是它的算法:
- 查找字符串中的单词"Control"及其结尾
- 查找 后的一组数字
- 按int提取数字。解析或TryParse
- 如果不是字符串的结尾-转到第一步
这个算法的实现几乎是原始的…)
这是最简单的实现(你的字符串是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 ++;
}