.Split()在某个位置而不是在char上?

时间:2014-08-14 01:13:08

标签: c# regex string split

我有这个方法来比较序列号然后将它递增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

,则使用此(上述)方法

2 个答案:

答案 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"
}