增加字符串中的数字(C#)

在短划线(“ – ”)之后,我有一个带有数字的字符串。 我想创建相同的字符串,该数字加1,非常简单,但我想知道是否有更好的方法呢? 谢谢!

string oldString = "BA-0001-3"; int lastIndex = oldString.LastIndexOf("-"); string oldNumber = oldString.SubString(lastIndex + 1); string oldPartialString = oldString.SubString(0, lastIndex); int newNumber = Convert.ToInt32(oldNumber) + 1; string newString = oldPartialString + newNumber.ToString(); 

我可能会使用我的朋友string.Split

 string oldString = "BA-0001-3"; string[] parts = oldString.Split('-'); parts[parts.Length-1] = (Convert.ToInt32(parts[parts.Length-1])+1).ToString(); string newString = string.Join("-", parts); 

一个小的调整,可能会更快(通过访问parts.Length和减去1只一次 – 没有描述,所以它纯粹是一个猜测,它可能是一个边际差异,但最重要的是更强大(通过使用int.TryParse ):

 string oldString = "BA-0001-3"; string[] parts = oldString.Split('-'); int number; int lastIndex = parts.Length-1; parts[lastIndex] = (int.TryParse(parts[lastIndex], out number) ? ++number : 1).ToString(); string newString = string.Join("-", parts); 

正则表达式 ?

例:

 Regex.Replace("BA-0001-3", @"[AZ]{2}-\d{4}-(\d+)", m => (Convert.ToInt32(m.Groups[1].Value) + 1).ToString()) 

根据Ahmad Mageed的评论更新如下。 这是他的答案远远超过我现在的答案:-)

我会按你现在的方式做到这一点,但为了好玩,我想知道我是否能用linq做到这一点。

 var x = "BA-0001-3".Split('-'); var y = x.First() + "-" + x.ElementAt(1) + "-" + (Convert.ToInt32(x.Last()) + 1); 

这适用于LINQPad。

编辑:显然我不是linq的专业人士。 希望有关如何改进的其他答案/意见。

这是一个如何使用RegEx完成的示例:

 public void Test() { System.Text.RegularExpressions.Regex rx = new Regex(@"(?.*\-)(?\d+)"); string input = "BA-0001-3"; string output = string.Empty; int digit = 0; if (int.TryParse(rx.Replace(input, "${digit}"), out digit)) { output = rx.Replace(input, "${prefix}" + (digit + 1)); } Console.WriteLine(output); } 

使用正则表达式(现在似乎已经填充了更多细节)我最终得到的结果如下:

 var regex = new Regex(@"^(?[A-Za-z]{1,2})-(?[0-9]{4})-(?[0-9]+)$"); var newCode = regex.Replace("BA-0001-3", new MatchEvaluator(ReplaceWithIncrementedNumber)); 

MatchEvaluator函数的位置是:

 public static string ReplaceWithIncrementedNumber(Match match) { Debug.Assert(match.Success); var number = Int32.Parse(match.Groups["Number"].Value); return String.Format("{0}-{1}-{2}", match.Groups["Category"].Value, match.Groups["Code"].Value, number + 1); } 

这是一个暴露“部件号”的三个部分的类的示例。 不是特别花哨(也注意没有错误检查/validation)。

  class Program { static void Main(string[] args) { PartNumber p1 = new PartNumber("BA-0001-3"); for (int i = 0; i < 5; i++) { p1.Sub++; Debug.WriteLine(p1); } PartNumber p2 = new PartNumber("BA", 2, 3); for (int i = 0; i < 5; i++) { p2.Sub++; Debug.WriteLine(p2); } } } class PartNumber { public PartNumber(string make, int model, int sub) { Make = make; Model = model; Sub = sub; } public PartNumber(string part) { //Might want to validate the string here string [] fields = part.Split('-'); //Are there 3 fields? Are second and third fields valid ints? Make = fields[0]; Model = Int32.Parse(fields[1]); Sub = Int32.Parse(fields[2]); } public string Make { get; set; } public int Model { get; set; } public int Sub { get; set; } public override string ToString() { return string.Format("{0}-{1:D4}-{2}", Make, Model, Sub); } }