从字符串中获取最后一组数字,进行数学运算,重建为字符串?

Jax*_*ian 7 c# regex .net-4.0

我有一个代表"帐号"的字段,大多数情况下只是一个数字.我需要对这些"数字"进行一些自动递增.显然不适合做数学.我们决定为我们工作的规则是,我们希望找到最右边的数字组,并将它们自动递增一个并返回重建的字符串(即使这使得它更长一个字符).

这些数字的一些例子是:

  • AC1234 - > AC1235
  • GS3R2C1234 - > GS3R2C1235
  • 1234 - > 1235
  • A-1234 - > A-1235
  • AC1234g - > AC1235g
  • GS3R2C1234g - > GS3R2C1235g
  • 1234克 - > 1235克
  • A-1234g - > A-1235g
  • 999 - > 1000
  • GS3R2C9999g - > GS3R2C10000g

我正在使用C#/ .NET 4.0.我将Regex列为标签,但这不是必需的.此解决方案不必是正则表达式.

有什么好想法吗?理想的性能不是主要问题.除非它全部包含在正则表达式中,否则我宁愿拥有清晰易懂的代码.

谢谢!

spe*_*der 5

var src = "ap45245jpb1234h";
var match = Regex.Match(src, @"(?<=(\D|^))\d+(?=\D*$)");
if(match.Success)
{
    var number = int.Parse(match.Value) + 1;
    var newNum=string.Format(
      "{0}{1}{2}",
      src.Substring(0,match.Index),
      number,
      src.Substring(match.Index + match.Length));
    newNum.Dump(); //ap45245jpb1235h
}
Run Code Online (Sandbox Code Playgroud)

解释正则表达式:从(字符串的开头)或(非数字)开始,匹配一个或多个数字,后跟零个或多个非数字,然后是字符串的结尾.

当然,如果提取的数字具有前导零,那么事情就会出错.我会将此作为练习留给读者.

使用MatchEvaluator(由@LB在他/她的回答中建议),这变得更轻:

Regex.Replace(
    src,
    @"(?<=(\D|^))\d+(?=\D*$)",
    m => (int.Parse(m.Value)+1).ToString())
Run Code Online (Sandbox Code Playgroud)