【问题标题】:Using LINQ to parse the numbers from a string使用 LINQ 解析字符串中的数字
【发布时间】:2010-08-13 20:54:01
【问题描述】:

是否可以编写一个查询来获取所有可以从任何给定字符串解析为 int 的字符?

例如我们有一个字符串:"$%^DDFG 6 7 23 1"

结果必须是"67231"

更难一点:我们可以只得到前三个数字吗?

【问题讨论】:

  • 确切的要求并不完全清楚,像123abc456def这样的字符串会发生什么,你想返回123456123456,只是123或者也许123 等等?最佳方法取决于确切的规格。
  • @Paul 它说的是前三个数字。那怎么可能更准确呢?也许你想让我写 300 页的规格和一些带有一堆图表的商业计划? :)

标签: c# linq string c#-4.0 linq-to-objects


【解决方案1】:

这会给你你的字符串

string result = new String("y0urstr1ngW1thNumb3rs".
    Where(x => Char.IsDigit(x)).ToArray());

对于前 3 个字符,在 ToArray() 之前使用 .Take(3)

【讨论】:

  • 我不记得是谁先回答了这个解决方案。无论如何,我也在这里投票。此外,艾伦的得分超过 10k。
【解决方案2】:

以下应该可以工作。

var myString = "$%^DDFG 6 7 23 1";

//note that this is still an IEnumerable object and will need
// conversion to int, or whatever type you want.
var myNumber = myString.Where(a=>char.IsNumber(a)).Take(3);

尚不清楚您是否希望将 23 视为单个数字序列或 2 个不同的数字。我上面的解决方案假设您希望最终结果为672

【讨论】:

  • 您可以将 where 写为 .Where(char.IsNumber) 我认为因为它接受一个字符并返回一个布尔值 - 不需要 lamda。
  • @Rup:酷。学到了一些新东西。
【解决方案3】:
public static string DigitsOnly(string strRawData)
  {
     return Regex.Replace(strRawData, "[^0-9]", "");
  }

【讨论】:

    【解决方案4】:
    string testString = "$%^DDFG 6 7 23 1";
    string cleaned = new string(testString.ToCharArray()
        .Where(c => char.IsNumber(c)).Take(3).ToArray());
    

    如果您想使用白名单(并非总是数字):

    char[] acceptedChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
    string cleaned = new string(testString.ToCharArray()
        .Where(c => acceptedChars.Contains(c)).Take(3).ToArray());
    

    【讨论】:

      【解决方案5】:

      这样的事情怎么样?

      var yourstring = "$%^DDFG 6 7 23 1";  
      var selected = yourstring.ToCharArray().Where(c=> c >= '0' && c <= '9').Take(3);
      var reduced = yourstring.Where(char.IsDigit).Take(3); 
      

      【讨论】:

      • 我猜你可能不知道 LINQ 和 lambda 表达式。
      【解决方案6】:

      正则表达式:

      private int ParseInput(string input)
      {
          System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"\d+");
          string valueString = string.Empty;
          foreach (System.Text.RegularExpressions.Match match in r.Matches(input))
              valueString += match.Value;
          return Convert.ToInt32(valueString);
      }
      

      甚至更难:我们能得到 只有前三个数字?

          private static int ParseInput(string input, int take)
          {
              System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"\d+");
              string valueString = string.Empty;
              foreach (System.Text.RegularExpressions.Match match in r.Matches(input))
                  valueString += match.Value;
              valueString = valueString.Substring(0, Math.Min(valueString.Length, take));
              return Convert.ToInt32(valueString);
          }
      

      【讨论】:

        【解决方案7】:
        > 'string strRawData="12#$%33fgrt$%$5"; 
        > string[] arr=Regex.Split(strRawData,"[^0-9]"); int a1 = 0; 
        > foreach (string value in arr) { Console.WriteLine("line no."+a1+" ="+value); a1++; }'
        
        Output:line no.0 =12
        line no.1 =
        line no.2 =
        line no.3 =33
        line no.4 =
        line no.5 =
        line no.6 =
        line no.7 =
        line no.8 =
        line no.9 =
        line no.10 =5
        Press any key to continue . . .
        

        【讨论】:

          猜你喜欢
          • 2012-08-29
          • 1970-01-01
          • 1970-01-01
          • 2020-01-27
          • 2013-10-07
          • 1970-01-01
          • 2011-12-08
          • 2010-11-07
          • 2011-07-20
          相关资源
          最近更新 更多