Извлечь число в конце строки в С#
Вероятно, немного проанализировав это, но как бы предложить stackoverflow - лучший способ вернуть целое число, содержащееся в конце строки.
До сих пор я рассматривал использование простого цикла LINQ и regex, но мне любопытно, какие подходы я получу от сообщества. Очевидно, что это не сложно решить, но может иметь разницу в решениях.
Чтобы быть более конкретным, как бы вы создали функцию для возврата произвольно длинного целого/длинного, добавляемого в конце произвольно длинной строки?
CPR123 => 123
ABCDEF123456 => 123456
Ответы
Ответ 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
Смотрите онлайн-демонстрацию С#.