在C#中的字符串末尾提取数字

可能过分分析了一下,但stackoverflow建议如何返回包含在字符串末尾的整数的最佳方法。

到目前为止,我已经考虑使用一个简单的循环,LINQ和正则表达式,但我很好奇我将从社区获得什么方法。 显然,这不是一个难以解决的问题,但可能会在解决方案中产生差异。

所以更具体一点,你如何创建一个函数来返回一个任意长整数/长,并附加在任意长字符串的末尾?

CPR123 => 123 ABCDEF123456 => 123456 

使用此正则表达式:

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

或使用Stack ,可能更有效:

 var stack = new Stack(); 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()); 

强制性的LINQ单线程

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

就我的经验而言,正则表达式是最简单的。

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

这应该匹配它。 只需将其包装在一个函数中。

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

应该这样做我想

它总是采用LettersNumbers格式吗?

在这种情况下,这将工作:

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

\d+$正则表达式有点贵,因为默认情况下,字符串是从左到右解析的。 一旦正则表达式引擎在12abc34找到1 ,它将继续匹配2 ,当遇到a ,匹配失败,尝试下一个位置,依此类推。

但是,在.NET正则表达式中,有一个RegexOptions.RightToLeft修饰符。 它使正则表达式引擎从右到左解析字符串,您可以更快地获得已知更接近结束的匹配。

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

请参阅在线C#演示 。

我被允许对此发疯吗?

 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()); } 

一个简单的循环应该在其简单性和效率方面击败任何其他解决方案。 最终返回的字符串可以只复制一次而不使用Stack,StringBuilder,string.Concat或其他更复杂的字符串支持函数。

 string GetNumberFromEnd(string text) { int i = text.Length - 1; while (i >= 0) { if (!char.IsNumber(text[i])) break; i--; } return text.Substring(i + 1); } 

或者它甚至可以直接作为int类型返回:

 bool GetIntFromEnd(string text, out int number) { int i = text.Length - 1; while (i >= 0) { if (!char.IsNumber(text[i])) break; i--; } return int.TryParse(text.Substring(i + 1), out number); }