самый эффективный способ отделить строку - PullRequest
7 голосов
/ 28 марта 2012

У меня есть эта строка:

"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, "");

Ответы [ 6 ]

14 голосов
/ 28 марта 2012

Это дает то, что вы ожидаете:

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
5 голосов
/ 28 марта 2012

Ну, другой ответ, вероятно, лучше, но я все равно написал это, поэтому выкладываю:

Потребности:

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];
3 голосов
/ 28 марта 2012

Это должно быть очень быстро:

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);
2 голосов
/ 28 марта 2012

Я прочитал «самый эффективный» как «самый быстрый».

Я написал быстрый тест с длинной строкой, выполненный 10 миллионов раз.

Решение Остина об использовании TrimEnd побежал в4.649s

Мое решение работало за 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 не работает в отладочных битах).Итак, если вы выполняете мой код в своем приложении и создаете отладку, это будет медленнее.

1 голос
/ 28 марта 2012

Мне нравится 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);

Возможно, не самое лучшее и надежное решение, но оно подходит для вашей тестовой строки.

0 голосов
/ 28 марта 2012
 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);
...