Как удалить завершающие цифры, соответствующие шаблону из строки в C #? - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть следующая строка: 0000015700

Мне нужен алгоритм, который выполняет следующее:

  • идет к первой цифре, отличной от 0 справа налево(7, в данном случае)
  • извлекает 6 цифр, начиная с 7, идущих справа налево (вывод будет 000157

Это не может быть реализовано с помощью LINQ,поскольку проект работает на платформе .NET 2.0.

Как мне это сделать в C #?

Ответы [ 7 ]

8 голосов
/ 02 ноября 2011

Если вы не слишком заботитесь о производительности и у вас есть LINQ, вы можете сделать следующее:

var result = new string(text.Reverse()
                            .SkipWhile(c => c == '0')
                            .Take(6)
                            .Reverse()
                            .ToArray());

Надеюсь, это должно быть само за себя:)

3 голосов
/ 02 ноября 2011
using System.Text.RegularExpressions;

…   

var source = "0000015700";
var pattern = @"\d{5}[1-9](?=0*$)";
var result = Regex.Match(source, pattern);
if(result.Success)
{
    Console.WriteLine(result.Groups[0]);
}

Если вы не знакомы с регулярными выражениями, это язык для сопоставления строковых шаблонов, который встроен практически во все языки программирования общего назначения. Шаблон выше будет соответствовать вашей входной строке, если:

\d{5}: у вас есть 5 последовательных цифр
[1-9]: за ним следует любая цифра от 1 до 9 (не ноль)
(?=0*$): за ним следует ноль или более 0 с, а $ обозначает конец строки

Поскольку я добавил этот последний бит в (?= ), движок знает, что этот материал должен быть там, но не должен быть частью матча; это называется "позитивный взгляд"

3 голосов
/ 02 ноября 2011

Итак, насколько я понимаю, вы хотите, чтобы 6 цифр начинались с чего-то, отличного от 0 справа.Используйте регулярные выражения.

^.*([0-9]{5}[1-9])0*$

У меня нет опыта работы с C #, но похоже, что это должно работать:

using System.Text.RegularExpressions;

[...]

Match match = Regex.Match(input, @"^.*([0-9]{5}[1-9])0*$", RegexOptions.IgnoreCase);

// Here we check the Match instance.
if (match.Success)
{
    // Finally, we get the Group value and display it.
    string key = match.Groups[1].Value;
    Console.WriteLine(key);
}

При этом строка даже не должна иметь конечные нули(также будет работать с конечными нулями без конечных нулей).

3 голосов
/ 02 ноября 2011

Сначала вы должны обрезать конец строки, а затем получить необходимую подстроку:

var tmp = str.TrimEnd('0');
var result = tmp.Substring(Math.Max(0,tmp.Length - 6));
1 голос
/ 02 ноября 2011
string input = "0000015700";
string result = new string(
    input.Reverse()
            .SkipWhile(ch => ch == '0')
            .Take(6)
            .Reverse()
            .ToArray());
0 голосов
/ 02 ноября 2011

Вы можете попробовать это: в цикле for найдите последний индекс нулевого символа. Если он совпадает с последним индексом массива, удалите его.

0 голосов
/ 02 ноября 2011

Используйте string.LastIndexOf, чтобы найти первую ненулевую цифру справа налево, см. Пример ниже:

http://msdn.microsoft.com/en-us/library/ms224422.aspx

Затем выполните строку.подстрока индекса, возвращаемого string.LastIndexOf

...