【问题标题】:String parsing, extracting numbers and letters字符串解析,提取数字和字母
【发布时间】:2010-10-18 14:36:27
【问题描述】:

解析字符串并提取数字和字母的最简单方法是什么?我的字符串可以采用以下格式(数字|字母或字母|数字),即“10A”、“B5”、“C10”、“1G”等。

我需要提取两个部分,即“10A”->“10”和“A”。

更新:感谢大家提供的所有出色答案

【问题讨论】:

    标签: c# regex string text-parsing


    【解决方案1】:

    最简单的方法可能是使用正则表达式。

    ((?<number>\d+)(?<letter>[a-zA-Z])|(?<letter>[a-zA-Z])(?<number>\d+))
    

    然后您可以将它与您的字符串匹配并从组中提取值。

    Match match = regex.Match("10A");
    string letter = match.Groups["letter"].Value;
    int number = int.Parse(match.Groups["number"].Value);
    

    【讨论】:

      【解决方案2】:

      最简单最快的就是使用简单的字符串操作。使用IsDigit 方法检查字母的位置,并将字符串的其余部分解析为数字:

      char letter = str[0];
      int index = 1;
      if (Char.IsDigit(letter)) {
         letter = str[str.Length - 1];
         index = 0;
      }
      int number = int.Parse(str.Substring(index, str.Length - 1));
      

      【讨论】:

      • 不保证数字/字母的顺序。
      • @Samuel:是的。问题指定它是数字|字母或字母|数字。如果您认为代码不能同时处理两者,请再次检查代码。
      • @Guffa:如果字母在末尾,你会将它传递给 int.Parse。
      • 很好的答案。我喜欢你使用信息的方式,即只有一个字母,它必须是第一个或最后一个字符。
      • @Guffa:对不起,我的错。我有点脑子放屁。子字符串的第二个参数是长度而不是位置。
      【解决方案3】:

      只是为了与众不同:

      string number = input.Trim("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray());
      string letter = input.Trim("0123456789".ToCharArray());
      

      【讨论】:

        【解决方案4】:
        char letter = str.Single(c => char.IsLetter(c));
        int num = int.Parse(new string(str.Where(c => char.IsDigit(c)).ToArray()));
        

        这个解决方案不是非常严格(它允许“5A2”之类的东西并返回“A”和 52),但它可能适合您的目的。

        【讨论】:

          【解决方案5】:

          以下是我的处理方法。您可以逐步执行此操作并将 gc1["letter"]、gc1["number"]、gc2["letter"] 和 gc2["number"] 放在监视窗口中以查看它是否有效(刚刚过去最后一步当然是这里的代码行)。

          常规表达式将采用任一模式,在每种情况下都需要一个或多个字母和数字。

                  Regex pattern = new Regex("^(?<letter>[a-zA-Z]+)(?<number>[0-9]+)|(?<number>[0-9]+)(?<letter>[a-zA-Z]+)$");
                  string s1 = "12A";
                  string s2 = "B45";
                  Match m1 = pattern.Match(s1);
                  Match m2 = pattern.Match(s2);
                  GroupCollection gc1 = m1.Groups;
                  GroupCollection gc2 = m2.Groups;
          

          【讨论】:

          • 如果您要复制我的答案,至少要正确使用正则表达式。应该是 [a-zA-Z],没有加号。
          【解决方案6】:

          使用Sprache 和一些 Linq 功夫:

          var tagParser =
              from a in Parse.Number.Or(Parse.Letter.Once().Text())
              from b in Parse.Letter.Once().Text().Or(Parse.Number)
              select char.IsDigit(a[0]) ?
                     new{Number=a, Letter=b} : new{Number=b, Letter=a};
          
          var tag1 = tagParser.Parse("10A");
          var tag2 = tagParser.Parse("A10");
          
          tag1.Letter; // should be A 
          tag1.Number; // should be 10
          
          tag2.Letter; // should be A
          tag2.Number; // should be 10
          
          /* Output:
             A
             10
             A
             10
           */
          

          【讨论】:

            猜你喜欢
            • 2021-12-11
            • 2017-07-30
            • 2021-12-11
            • 1970-01-01
            • 2020-10-04
            • 2011-03-03
            • 2021-12-10
            • 1970-01-01
            相关资源
            最近更新 更多