【问题标题】:.Split() in a position rather than on a char?.Split() 在一个位置而不是在一个字符上?
【发布时间】:2014-08-14 01:13:08
【问题描述】:

我有这种方法来比较序列号,然后将其加一,在这样的字符串上使用.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)是固定长度,但是 A 在end 也可能不存在。例如。 MOT1PCP2001是另一种可能

我知道Regex 可用于定位字符串中的位置,但我不确定如何在此字符串上实现它(或者我什至可以吗?)

编辑:我还应该注意,我有一个布尔值来告诉我是否有分隔符,所以如果separator == true

使用这个(上面的)方法

【问题讨论】:

  • 序号是多少?
  • @hwnd 001。这将始终采用'D3' 格式。 A 是重复号码指示。
  • 您在拆分后比较001 序列?还是拆分并仅增加 1?
  • 此方法切断newCblNum (CP1-P-CP2) 的末尾,并查找任何其他现有的相同数字的字符串。然后它返回最大的数字(例如CP1-P-CP2-003)并将结束数字(003)加一,然后将其附加到newCblNum

标签: c# regex string split


【解决方案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"
} 

【讨论】:

  • 哇,非常感谢!可惜这有点让我以前的方法没用了哈哈,但这绝对是一个巨大的节省时间!
【解决方案2】:

由于您的字符串从尾部开始的长度是固定的,这就是匹配的方式:

(\d{3})(?:-A)?$

使用该模式匹配以 3 位数字结尾(匹配 $)的字符串(因为 \d{3}),后跟可能的 -A。该号码将存储在匹配组 1 中,您可以对其进行操作。


我认为这就是 C# 实现的样子:

Match m = Regex.Match( cblNumber, @"(\d{3})(?:-A)?$" );

【讨论】:

  • 你能定义我如何声明这个吗(我假设我使用Regex?)
  • @Ben 我必须阅读有关如何实现正则表达式的 C# 文档。上面的代码段是你可以在字符串类型变量cblNumber上使用的正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
相关资源
最近更新 更多