我有一个这样的字符串(我的readline):
alfa:10662 beta:-64 gama:70679 delta:1001
我需要使用这些数字作为参数,但这些数字可以有不同的长度。我可以想象,我可以用以下方法提取值:
str1 = readline.Substring(6, 5);
但是,如果β和alpha的值可以变化,我将如何得到gamma的值?
答案 0 :(得分:4)
您可以使用正则表达式匹配所有name:value
对,并使用捕获组来提取名称和值:
var readline = "alpha: 10662 beta: -64 gamma: 70679 delta: 1001";
var matches = Regex.Matches(readline, @"(?<parameter>\w*):\s*(?<value>-?\d*)");
var dictionary = new Dictionary<string,int>();
foreach (Match m in matches)
{
dictionary.Add(m.Groups["parameter"].Value,int.Parse(m.Groups["value"].Value));
}
Console.WriteLine(dictionary["gamma"]); // output: 70679
答案 1 :(得分:2)
我会以不同的方式使用子字符串。首先,在分隔符上拆分以产生一个键/值数组,其中键位于偶数位置,值位于奇数位置。然后你可以通过2s遍历数组,选择与所需键相关的值,或者,如果它们总是以相同的顺序,只需选择要转换的正确数组元素。
根据需要应用输入验证,以确保没有损坏的输入。
var parameters = line.Split( new [] { ':', ' ' }, StringSplitOptions.RemoveEmptyEntries );
for (var i = 0; i < parameters.Length; i += 2 )
{
var key = parameters[i];
var value = int.Parse( parameters[i+1] );
// do something with the value based on the key
}
答案 2 :(得分:2)
这似乎非常适合正则表达式:
var regex = new Regex(@"(\w+)\:\s(-?\d+)");
var values = from pair in regex.Matches("alfa: 10662 beta: -64 gama: 70679 delta: 1001").OfType<Match>()
select new { Key = pair.Groups[1].Value, pair.Groups[2].Value };
答案 3 :(得分:0)
我不会为此使用SubString;它会更加冗长和容易出错。
最简单的是,看起来好像所有数据都是由空格分隔的。这是一个公平的假设吗?每个变量的顺序是否始终相同?如果是这样,那么你可以简单地拆分空格并抓住其他所有数字;
如果数据不总是相同的形式,那么我会使用正则表达式。您可以使用以下形式的内容:
/alfa: ([+-]\d+)/
将捕获“alpha:”和符号后面的数字。对于浮点值,您需要更有趣的东西。老实说,我非常很少使用正则表达式,当我写一个非平凡的正则表达式我总是使用正则表达式伙伴,所以我不想在这里写一个全面的,因为它会带我太长了=)
编辑:看,马克的正则表达式比我的要好得多。