我有这个方法来比较序列号然后将它递增1,在这样的字符串上使用.Split('-')
方法:CP1-P-CP2-001-A
if (CView.dgvCreate.Rows.Count != 0)
{
string tempCbl = cblNumber.TrimEnd('-');
string newCblNum = null;
foreach (DataGridViewRow row in CView.dgvCreate.Rows)
{
DataGridViewCell cell = row.Cells[0];
string[] substring = cell.Value.ToString().Split('-');
for (int i = 0; i < substring.Count() - 1; i++)
{
newCblNum += substring[i] + "-";
}
if (newCblNum.TrimEnd('-') == tempCbl)
{
int i = Convert.ToInt32(substring[substring.Count() - 1]);
cblNumber = newCblNum + (i + 1).ToString("D3");
CView.txtCableNumber.Text = cblNumber;
}
else { GenerateCableNumberDb(CView); }
}
if (CView.chkParallel.Checked == true)
{
ParallelCableNumber(CView);
}
else { dataList.Add(cblNumber); }
}
else { GenerateCableNumberDb(CView); }
然而,分隔符( - )可能不存在,导致字符串看起来像这样:CP1PCP2001A
。
另外,我应该注意,字符串的前3个部分是可变长度,只有最后2个部分(Sequence - 001
和Parallel - A
)是固定长度,但是{最后{1}}可能也不存在。例如。 A
是另一种可能性
我知道MOT1PCP2001
可以用来定位字符串中的位置,但是我不知道如何在这个字符串上实现它(或者我是否可以?)
编辑:我还应该注意,我有一个布尔告诉我是否有分隔符,所以如果Regex
答案 0 :(得分:1)
由于你的字符串将从尾部开始固定长度,这就是匹配的方式:
(\d{3})(?:-A)?$
使用模式将字符串结尾(匹配$
)与3位数(因为\d{3}
)匹配,后跟可能的-A
。该号码将存储在匹配组1中,您可以对其进行操作。
我认为这就是C#实现的样子:
Match m = Regex.Match( cblNumber, @"(\d{3})(?:-A)?$" );
答案 1 :(得分:1)
在这种情况下,最好匹配子字符串,而不是尝试在多个位置进行拆分。
string s = "CP1-P-CP2-001-A";
Match m = Regex.Match(s, @"\d{3}(?=[A-]|$)");
if (m.Success) {
int i = Convert.ToInt32(m.Value); i += 1;
Console.WriteLine(i.ToString("D3")); //=> "002"
}