我有一个简单的问题,但我想以最好的方式解决。基本上,我有这样一种格式的字符串:<some letters><some numbers>
,即q1
或qwe12
。我想做的就是从中得到两个字符串(然后我可以将数字部分转换为整数,也可以不转换为整数)。第一个是给定字符串的“字符串部分”,即qwe
,第二个是“数字部分”,即12
。而且不会出现数字和字母混合的情况,例如qw1e2
。
我当然知道,我可以使用StringBuilder
,然后进行for
循环,并检查每个字符是否为数字或字母。简单。但是我认为这不是一个很明确的解决方案,因此我想问您是否有一种方法,一种内置方法或类似方法可以在1-3行中完成?还是不使用循环?
答案 0 :(得分:4)
您可以使用带有命名组的正则表达式来识别您感兴趣的字符串的不同部分。
例如:
string input = "qew123";
var match = Regex.Match(input, "(?<letters>[a-zA-Z]+)(?<numbers>[0-9]+)");
if (match.Success)
{
Console.WriteLine(match.Groups["letters"]);
Console.WriteLine(match.Groups["numbers"]);
}
答案 1 :(得分:1)
您可以尝试使用 Linq 代替正则表达式:
string source = "qwe12";
string letters = string.Concat(source.TakeWhile(c => c < '0' || c > '9'));
string digits = string.Concat(source.SkipWhile(c => c < '0' || c > '9'));
答案 2 :(得分:1)
您可以使用Where()
库(https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.where)中的System.Linq
扩展方法,仅过滤数字(数字)个字符,并转换生成的IEnumerable
包含字符数组中的所有数字,可用于创建新的string
:
string source = "qwe12";
string stringPart = new string(source.Where(c => !Char.IsDigit(c)).ToArray());
string numberPart = new string(source.Where(Char.IsDigit).ToArray());
MessageBox.Show($"String part: '{stringPart}', Number part: '{numberPart}'");
来源:
答案 3 :(得分:0)
如果可能,请在字母和数字之间添加空格(q 3,qet 64等),并使用string.split 否则,使用for循环,就不难了
答案 4 :(得分:0)
您可以将其作为聚合的一部分进行测试:
var z = "qwe12345";
var b = z.Aggregate(new []{"", ""}, (acc, s) => {
if (Char.IsDigit(s)) {
acc[1] += s;
} else {
acc[0] += s;
}
return acc;
});
Assert.Equal(new [] {"qwe", "12345"}, b);