代码之家  ›  专栏  ›  技术社区  ›  Matt Warren

字符串分析,提取数字和字母

  •  5
  • Matt Warren  · 技术社区  · 15 年前

    解析字符串并提取数字和字母的最简单方法是什么?我有以下格式的字符串(数字字母或字母数字),即“10a”、“b5”、“c10”、“1g”等。

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

    更新: 感谢大家的回答。

    6 回复  |  直到 15 年前
        1
  •  12
  •   Samuel    15 年前

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

    ((?<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
  •  6
  •   Guffa    15 年前

    最简单和最快的是使用简单的字符串操作。使用 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));
    
        3
  •  4
  •   mqp    15 年前
    char letter = str.Single(c => char.IsLetter(c));
    int num = int.Parse(new string(str.Where(c => char.IsDigit(c)).ToArray()));
    

    这个解决方案不是非常严格(它允许像“5A2”这样的操作,并返回“A”和52),但对于您的目的来说可能是好的。

        4
  •  3
  •   Daniel LeCheminant    15 年前

    只是为了与众不同:

    string number = input.Trim("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray());
    string letter = input.Trim("0123456789".ToCharArray());
    
        5
  •  1
  •   Rich    15 年前

    下面是我将如何处理这个问题。您可以单步执行此操作,并将gc1[“letter”]、gc1[“number”]、gc2[“letter”]和gc2[“number”]放在监视窗口中,以查看它是否正常工作(当然,请单步执行最后一行代码)。

    在每种情况下,常规EPX会话将采用需要一个或多个字母和数字的模式。

            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;
    
        6
  •  0
  •   Brian Chavez    11 年前

    使用 Sprache 还有一些林克功夫:

    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
     */