2

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

ahde7394

所以我想获得的是:

阿德

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

3 回答 3

5

我同意 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
于 2013-09-29T09:49:14.423 回答
1

LINQ 可能不是这里的最佳解决方案。看看String.IndexOfAny 方法

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"
于 2013-09-29T09:46:45.537 回答
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.

于 2013-09-29T09:50:37.113 回答