7

我有这个字符串:

“B82V16814133260”

从中获取两个字符串的最有效方法是什么:

左部分字符串:“B82V” 右部分字符串:“16814133260”

规则是这样的:取出右侧的所有数字并从中创建字符串,然后取出提醒并将其放入另一个字符串中。

这是我的解决方案,但它太笨重了!如何做到又短又高效?

        String leftString = "";
        String rightString="";

        foreach (char A in textBox13.Text.Reverse())
        {
            if (Char.IsNumber(A))
            {
                rightString += A;
            }
            else
            {
                break;
            }
        }

        char[] arr = rightString.ToArray();
        Array.Reverse(arr);

        rightString=new string(arr);
        leftString = textBox13.Text.Replace(rightString, "");
4

6 回答 6

14

这会产生您所期望的:

var given = "B82V16814133260";
var first = given.TrimEnd("0123456789".ToCharArray());
var rest = given.Substring(first.Length);

Console.Write("{0} -> {1} -- {2}", given, first, rest);
//  B82V16814133260 -> B82V -- 16814133260
于 2012-03-28T18:59:03.193 回答
5

好吧,另一个答案可能更好,但我还是写了这个,所以我发布了它:

需求:

using System.Text.RegularExpressions;

代码:

string str = "B82V16814133260";
string[] match = Regex.match(str, @"^([\d\w]+?\w)(\d+)$").Groups;
string left = match[1];
string right = match[2];
于 2012-03-28T19:07:01.957 回答
3

这应该非常快:

int index = text.Length - 1;
while (index >= 0 && Char.IsDigit(text[index]))
{
    index--;
}
string left = text.Substring(0, index + 1);
string right = text.Substring(index + 1);
于 2012-03-28T19:01:03.023 回答
2

我将“最有效”读作“最快”。

我用长字符串写了一个快速测试,运行了 1000 万次。

Austin 的使用解决方案TrimEnd在 4.649 秒内运行

我的解决方案在 1.927 秒内运行

    int j = given.Length - 1;

    for (; j >= 0; j--)
    {
      char c = given[j];
      if (c < '0' || c > '9')
      {
        break;
      }
    }

    var first = given.Substring(0, j + 1);
    var rest = given.Substring(j + 1);

请注意,我的构建没有调试(在调试中,我的解决方案较慢,但那是因为 TrimEnd 没有在调试位中运行)。所以,如果你在你的应用程序中运行我的代码,并且正在构建调试,它会更慢。

于 2012-03-28T19:47:58.570 回答
1

我喜欢linq。

    var s = "B82V16814133260";
    var lastNonNumeric = s.Reverse().Where(x => !char.IsDigit(x)).FirstOrDefault();
    var index = s.LastIndexOf(lastNonNumeric);
    var secondString = s.Substring(index + 1);
    var firstString = s.Substring(0, index+1);

可能不是最好或最强大的解决方案,但它适用于您的测试字符串。

于 2012-03-28T19:02:35.123 回答
0
 string Source = textBox13.Text;

 for (i = Source.Length - 1; i >=0; i--)
 {
      if (! Char.IsNumber(Source[i])
         break;
 }

 string leftString = Source.Left(i+1);
 string rightString = Source.Right(i+1,Source.Length-i-1);
于 2012-03-28T19:15:59.617 回答