5

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

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

更新:感谢大家的所有优秀答案

4

6 回答 6

13

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

((?<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);
于 2009-04-09T16:30:48.650 回答
6

最简单最快的是使用简单的字符串操作。使用该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));
于 2009-04-09T16:31:46.090 回答
4

只是要与众不同:

string number = input.Trim("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray());
string letter = input.Trim("0123456789".ToCharArray());
于 2009-04-09T16:34:40.110 回答
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),但它可能适合您的目的。

于 2009-04-09T16:46:56.897 回答
1

这是我将如何处理这个问题。您可以逐步执行此操作并将 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;
于 2009-04-09T16:35:02.977 回答
0

使用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
 */
于 2012-11-23T07:41:32.150 回答