字符串的前 N ​​个字符,直到它们不是数字

First N Characters of a String until they are not digits

我有一个很长的字符串,例如下面两个字符串:

  1. 93434234adfjasdf asdfjksdfkl afjasdlfjl asdfjsdlkfjasldf ksdafjlaskdfjasdf
  2. 123asdjfklasdfj asdf asdfjlkasd jasdlfkja sdfj klasdjfkl asdflk asdfj

我知道字符串每次都以数字开头,但我不知道字符串中有多少个字符是数字。当然,我可以做这样的事情:

string completeText = "93434234adfjasdf asdfjksdfkl afjasdlfjl asdfjsdlkfjasldf ksdafjlaskdfjasdf";
char[] charSequence = completeText.ToCharArray();
int counter = 0;
foreach (var charItem in charSequence)
{
    if (Char.IsDigit(charItem))
    {
        counter++;
    }
    else
    {
        //Leave loop
        break;
    }
}
string myDigitsAtTheBeginningOfTheString = completeText.Substring(0, counter);

有没有更流畅的方法?

您可以使用 TakeWhile:

Returns elements from a sequence as long as a specified condition is true, and then skips the remaining elements.

using System;
using System.Linq;

public static void Main()
{
    var input = "93434234adfjasdf asdfjksdfkl afjasdlfjl asdfjsdlkfjasldf ksdafjlaskdfjasdf";
    Console.WriteLine(string.Concat(input.TakeWhile(char.IsDigit)));
}

Try it Online!

如果您想避免使用 Linq(但 TakeWhile 很不错),您可以重写代码以使用简单的 for 循环和 StringBuilder:

using System;
using System.Text;

public static void Main()
{
    var input = "93434234adfjasdf asdfjksdfkl afjasdlfjl asdfjsdlkfjasldf ksdafjlaskdfjasdf";
    var sb = new StringBuilder();
    for (var counter = 0; char.IsDigit(input[counter]) && counter < input.Length; counter++) {
        sb.Append(input[counter]);
    }

    Console.WriteLine(sb.ToString());
}

Try it Online!

(?<numbers>^[0-9]*)

将匹配从字符串开头开始的所有从 0-9 的数字,并将它们放在 <numbers> 组中。