【问题标题】:How to cut rest of string after substring in c#?如何在c#中的子字符串之后剪切字符串的其余部分?
【发布时间】:2011-09-17 23:28:18
【问题描述】:

我得到一个这样的字符串(我的 readline):

阿尔法:10662 贝塔:-64 伽马:70679 德尔塔:1001

我需要使用其中一些数字作为参数,但这些数字可以有不同的长度。我可以想象我可以用它来提取价值阿尔法:

str1 = readline.Substring(6, 5);

但是,如果 beta 和 alpha 的值可以变化,我将如何获得 gamma 的值?

【问题讨论】:

  • 我建议使用正则表达式,并将值提取为匹配项。

标签: c# substring


【解决方案1】:

您可以使用正则表达式匹配所有 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

【讨论】:

  • 我很确定您需要一个捕获组来提取您需要的确切值。
  • 我在正则表达式中添加了捕获组。
【解决方案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
 }

【讨论】:

  • 哦,与正则表达式相比,在冒号上拆分是一种有趣的方法。
【解决方案3】:

这似乎很适合正则表达式:

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 };

【讨论】:

    【解决方案4】:

    我不会为此使用 SubString;它会更冗长且容易出错。

    最简单的情况是,您的所有数据似乎都由空格分隔。这是一个公平的假设吗?每个变量的顺序总是相同的吗?如果是这样,那么您可以简单地在空格上拆分并获取其他所有数字;

    如果数据并不总是相同的形式,那么我会使用正则表达式。您可以使用以下形式:

    /alfa: ([+-]\d+)/
    

    这将捕获“alpha:”和符号之后的数字。对于浮点值,您将需要一些花哨的东西。老实说,我非常很少使用正则表达式,当我写一个不平凡的正则表达式时,我总是使用正则表达式,所以我不想在这里为你写一个全面的,因为它会占用我太长了=)

    编辑:看,马克的正则表达式比我的要好得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 2015-11-12
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      相关资源
      最近更新 更多