我的字符串末尾有一个数字,后面是短划线(“ - ”)。我想用这个数字增加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();
答案 0 :(得分:7)
示例:
Regex.Replace("BA-0001-3", @"[A-Z]{2}-\d{4}-(\d+)",
m => (Convert.ToInt32(m.Groups[1].Value) + 1).ToString())
答案 1 :(得分:7)
我可能会使用我的朋友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);
答案 2 :(得分:2)
根据Ahmad Mageed的评论更新如下。这是他现在的答案: - )
我会按照你现在的方式做到这一点,但为了好玩,我想知道我是否可以用linq做到这一点。
var x = "BA-0001-3".Split('-');
var y = x.First() + "-" + x.ElementAt(1) + "-" + (Convert.ToInt32(x.Last()) + 1);
这适用于LINQPad。
编辑:显然我不是linq的专业人士。希望有关如何改进的答案/评论。
答案 3 :(得分:1)
这是一个如何用RegEx完成的例子:
public void Test()
{
System.Text.RegularExpressions.Regex rx = new Regex(@"(?<prefix>.*\-)(?<digit>\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);
}
答案 4 :(得分:1)
使用正则表达式(现在似乎已经填充了更多细节)我最终会得到类似的结果:
var regex = new Regex(@"^(?<Category>[A-Za-z]{1,2})-(?<Code>[0-9]{4})-(?<Number>[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);
}
答案 5 :(得分:0)
这是一个暴露“部件号”的三个部分的类的示例。不是特别花哨(也注意没有错误检查/验证)。
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);
}
}