使用linq拆分数字和字符串

时间:2013-09-29 09:41:24

标签: c# string-split

我有一个字符串,其第一部分是字符串,最后一个是数字,如下所示:

ahde7394

所以我想获得的是:

ahde

7394

我曾想过先提取字符串,然后从字符的最后一个位置获取数字,直到字符串结束,所以我认为使用索引器可以某种方式完成:

var stringQuery = NameComp.Select((str,index) => new {myStr=str, position=index})
                                               .Where(c => !Char.IsDigit(c.myStr)).Select((ch,pos) => new { newStr=ch, pos=pos} );

然后我可以做:

1)获取字符串:stringQuery.newStr

2)获取数字:stringQuery.Skip(stringQuery.pos).Select(d => d);

但是它没有用,在获取stringQuery之后我无法访问它的项目,因为它是一个匿名类型....

有什么想法吗?

使用LINQ的解决方案,猜测str =“ahde7394”:

string letters = new string(str.TakeWhile(c => Char.IsLetter(c)).ToArray());

和数字:

string number = new string(str.Skip(letters.Length).TakeWhile(c => Char.IsDigit(c)).ToArray());

或者更好地猜测最后一部分是一个数字:

   string number = str.Substring(name.Length);

3 个答案:

答案 0 :(得分:4)

我同意dtb,LINQ可能不是正确的解决方案。

正则表达式是另一种选择,假设你的字符串可以比你提供的更加可变。

var str = "ahde7394";

var regex = Regex.Match(str, @"([a-zA-Z]+)(\d+)");

var letters = regex.Groups[1].Value; // ahde
var numbers = regex.Groups[2].Value; // 7394

答案 1 :(得分:1)

LINQ可能不是最好的解决方案。看看String.IndexOfAny Method

char[] digits = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

string input = "ahde7394";

int index = input.IndexOfAny(digits);

string head = input.Substring(0, index);  // "ahde"
string tail = input.Substring(index);     // "7394"

答案 2 :(得分:1)

您可以使用String.IndexOfString.Substring之类的;

string s = "ahde7394";
int index = 0;
foreach (var i in s)
{
     if(Char.IsDigit(i))
     {
        index = s.IndexOf(i);
        break;
     }
}

Console.WriteLine(s.Substring(0, index));
Console.WriteLine(s.Substring(index));

输出将是;

ahde
7394

这里有 DEMO