Извлечь число в конце строки в С# - программирование
Подтвердить что ты не робот

Извлечь число в конце строки в С#

Вероятно, немного проанализировав это, но как бы предложить stackoverflow - лучший способ вернуть целое число, содержащееся в конце строки.

До сих пор я рассматривал использование простого цикла LINQ и regex, но мне любопытно, какие подходы я получу от сообщества. Очевидно, что это не сложно решить, но может иметь разницу в решениях.

Чтобы быть более конкретным, как бы вы создали функцию для возврата произвольно длинного целого/длинного, добавляемого в конце произвольно длинной строки?

CPR123 => 123
ABCDEF123456 => 123456
4b9b3361

Ответ 1

Используйте это регулярное выражение:

\d+$

var result = Regex.Match(input, @"\d+$").Value;

или используя Stack, возможно, более эффективно:

var stack = new Stack<char>();

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

    stack.Push(input[i]);
}

var result = new string(stack.ToArray());

Ответ 2

Regex был бы самым простым, насколько мне известно.

Regex ex = new Regex(@"(\d+)$")

Это должно совпадать. Просто оберните это в функцию.

Ответ 3

[^0-9]+([0-9]+)

должен это сделать. Думаю,

Ответ 4

Всегда ли это в формате LettersNumbers?

В этом случае это будет работать:

Regex _cellAddressRegex = new Regex(@"(?<Column>[a-z]+)(?<Row>[0-9]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
var rowm = Convert.ToInt32(parts.Groups["Row"]);

Ответ 5

Обязательный однострочный LINQ

var input = "ABCD1234";
var result = string.Concat(input.ToArray().Reverse().TakeWhile(char.IsNumber).Reverse());

Ответ 6

Мне разрешено сходить с ума?

using System.Text;
using System.Linq;

static string GetNum(string input)
{
    StringBuilder sb = new StringBuilder();
    for (int i = input.Length - 1; i >= 0; i--)
    {
        if (input[i] < 48 || input[i] > 57)
            break;

        sb.Append(input[i]);
    }

    return String.Concat(sb.ToString().ToCharArray().Reverse());
}

Ответ 7

Образец, похожий на \d+$, немного дороже, поскольку по умолчанию строка анализируется слева направо. Как только механизм регулярных выражений найдет 1 в 12abc34, он будет соответствовать 2, и когда он встретится с a, совпадение не будет выполнено, следующая позиция будет проверена и т.д.

Однако в .NET regex существует модификатор RegexOptions.RightToLeft. Это заставляет механизм регулярных выражений анализировать строку справа налево, и вы можете получить совпадения, которые, как известно, ближе к концу намного быстрее.

var result = Regex.Match("000AB22CD1234", @"\d+$", RegexOptions.RightToLeft);
if (result.Success) 
{ 
    Console.Write(result.Value);
}  // => 1234

Смотрите онлайн-демонстрацию С#.