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

5

如何最简单地解析字符串并提取数字和字母?我有一个字符串,可以是以下格式之一(数字|字母或字母|数字),即“10A”,“B5”,“C10”,“1G”等。

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

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

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

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

数字/字母的顺序不能保证。 - Samuel
@Samuel:是的,没错。问题指定了它要么是数字|字母或者字母|数字。如果你认为代码没有同时处理这两种情况,请再次检查代码。 - Guffa
@Guffa:如果这个字母在结尾,你可以将其传入 int.Parse。 - Samuel
很棒的答案。我喜欢你利用只有一个字母且必须是第一个或最后一个字符的信息的方式。 - Michał Piaskowski
@Guffa:抱歉,是我犯了个小错误。Substring的第二个参数是长度而不是位置。 - Samuel
比正则表达式快得多!是的,我进行了性能测试。 - stack247

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),但对于您的目的来说可能已经足够了。


4

只是出于不同的考虑:

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

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;

1
如果你要几乎复制我的答案,至少要把正则表达式搞对。应该是[a-zA-Z],没有加号。 - Samuel

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接