我有这个序列号:
string serialTXT = "SD50MRF999";
我想将其增加到“ SD50MRF1000”,而不是“ SD51MRF000”。
我尝试过这个:
var prefix = Regex.Match(sdesptchNo, "^\\D+").Value;
var number = Regex.Replace(sdesptchNo, "^\\D+", "");
var i = int.Parse(number) + 1;
var newString = prefix + i.ToString(new string('0', number.Length));
但是结果是:它隔离了“ SD”和“ 50MRF1000”
答案 0 :(得分:3)
通常,我会为此目的使用LINQ:
string serialTXT = "SD50MRF01";
string intPart = string.Join("", serialTXT.Reverse().TakeWhile(char.IsDigit).Reverse());
int intP = int.Parse(intPart);
serialTXT = serialTXT.Remove(serialTXT.Length - intPart.Length) +
(intP < 10 ? "0" + (intP + 1) : (intP + 1).ToString());
结果=>“ SD50MRF1000”
请不要忘记将其添加到您的using指令中:
using System.Linq;
答案 1 :(得分:1)
您可以使用正则表达式获取最后一位数字,然后将其转换为数字,然后将其添加到不匹配的字符串部分的末尾:
string serialTXT = "SD50MRF999";
Regex re = new Regex( "([0-9]+)$"); /* digits at the end */
string end = re.Match(serialTXT).Value;
int newNum = int.Parse(end) + 1; /* we need a number to increment it */
string newSerial = serialTXT.Substring(0, serialTXT.Length - end.Length) + newNum;
答案 2 :(得分:0)
一个非正则表达式的答案是检查字符串中的最后一个字符以查看它是否是一个数字,然后检查下一个,以此类推,直到获得您的数字为止。
答案 3 :(得分:0)
就像@ S.Akbari一样,我认为Linq在这里可以很好。此代码段适用于"SD50MRF50"
之类的字符串。
public static void Main()
{
var str = "SD50MRF999";
var digits = str.Reverse().TakeWhile(char.IsDigit);
var number = digits.Select((x,i) => (x - '0') * Math.Pow(10, i)).Sum();
var letters = str.Remove(str.Length - digits.Count());
// use letters + (++number).ToString("00")
// or letters + (++number).ToString("D2")
// to write `01`, `02`, `03` etc.
Console.WriteLine(letters + (++number));
}