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

C# 字符串解析,提取数字和字母,c#,regex,string,text-parsing,C#,Regex,String,Text Parsing,解析字符串并提取数字和字母的最简单方法是什么?我有以下格式的字符串(数字|字母或字母|数字),即“10A”、“B5”、“C10”、“1G”等 我需要提取两部分,即“10A”->“10”和“A” 更新:感谢所有人的精彩回答最简单的方法可能是使用正则表达式 ((?<number>\d+)(?<letter>[a-zA-Z])|(?<letter>[a-zA-Z])(?<number>\d+)) 最简单和最快的方法是使用简单的字符串操作。使用IsDig

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

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


更新:感谢所有人的精彩回答

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

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

最简单和最快的方法是使用简单的字符串操作。使用
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));
只是为了与众不同:

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

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

常规的EPXpression将采用任何一种模式,每种情况下都需要一个或多个字母和数字

        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;
Regex模式=新的Regex(“^(?[a-zA-Z]+)([0-9]+)|([0-9]+)([a-zA-Z]+)$”;
字符串s1=“12A”;
字符串s2=“B45”;
匹配m1=模式匹配(s1);
匹配m2=模式匹配(s2);
GroupCollection gc1=m1.组;
GroupCollection gc2=m2.组;
这个解决方案不是非常严格(它允许使用“5A2”并返回“A”和52),但对于您的目的来说可能还不错。

使用一些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
 */

数字/字母的顺序不能保证。@Samuel:是的。这个问题指定它是数字|字母还是字母|数字。如果您认为代码不能同时处理这两个问题,请再次检查代码。@Guffa:如果字母在末尾,您将把它传递到int.Parse.Great answer。我喜欢你使用信息的方式,只有一个字母,必须是第一个或最后一个字符。@Guffa:对不起,我弄错了。我有一个小小的大脑放屁。Substring的第二个参数是长度而不是位置。如果你想复制我的答案,至少要正确地使用正则表达式。它应该是[a-zA-Z],没有加号。
char letter = str.Single(c => char.IsLetter(c));
int num = int.Parse(new string(str.Where(c => char.IsDigit(c)).ToArray()));
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
 */