解析字符串并提取数字和字母的最简单方法是什么?我的字符串可以是以下格式(数字|字母或字母|数字),即“10A”,“B5”,“C10”,“1G”等。
我需要提取2个部分,即“10A” - > “10”和“A”。
更新:感谢大家提供的所有优秀答案
答案 0 :(得分:12)
最简单的方法可能是使用正则表达式。
((?<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);
答案 1 :(得分: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));
答案 2 :(得分: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)但是它可能适合你的目的。
答案 3 :(得分:3)
只是为了与众不同:
string number = input.Trim("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray());
string letter = input.Trim("0123456789".ToCharArray());
答案 4 :(得分: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;
答案 5 :(得分:0)
使用Sprache和一些Linq kung-fu:
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
*/