如何从大字符串中提取5位数字?

时间:2019-09-20 12:07:49

标签: c# winforms

我使用了计时器来运行string,也曾经使用过while,但我想知道是否有更快的方法。我有一个包含日期序列号的字符串,日期始终在文本d|

之后
private void Timer1_Tick(object sender, EventArgs e)
{
    string caldata = textBox6.Text;
    textBox7.Text = caldata.Length.ToString();

    if (caldata.Substring(0, 2) == "d|")
    {
        // MessageBox.Show("Found date" + caldata.Substring(2, 5));
        listBox1.Items.Add(caldata.Substring(2, 5));

        textBox6.Text = caldata.Remove(0, 7);
        caldata = textBox6.Text;
    }
    else
    {
        textBox6.Text = caldata.Remove(0, 1);
        caldata = textBox6.Text;
    }


    if (caldata.Length < 4)
    {
        timer1.Enabled = false;
    }
}

我包含数据的字符串看起来像附件一样。

2 个答案:

答案 0 :(得分:1)

通常,可以通过仔细的调试和逐步执行代码来解决您的问题。

无论如何,以下是我的建议:

您可以使用正则表达式:(?<=d\|)\d{5}

说明:

(?<=d\|)-积极的态度:断言什么是d\|

\d{5}-匹配5位数字

代码示例

  string caldata = "";
  MatchCollection matches = Regex.Matches(caldata, @"(?<=d\|)\d{5}");
  foreach (Match match in matches)
  {
    string txt = match.Value;
    // ... do smoething with text
  }

答案 1 :(得分:0)

“删除”和“子字符串”是非常慢的字符串操作,如果要从字符串中提取数据,则应尝试仅查找该字符串,而不要删除其周围的无关数据。

正则表达式似乎是解决问题的方法,在这种情况下,“(?! d \ |)\ d {5}”应该是最快的。

因此您的代码应如下所示:

var matches = Regex.Matches(caldata, @"(?!d\|)\d{5}");
foreach(Match m in matches)
{
  listbox1.Items.Add(m.Value);
}