在c#中查找出现在某个子字符串之后的第一个数字的索引

find the index of the first number that appears after a certain substring in c#

背景信息

我有一个 fez panda II(即 netmf 4.1 上的 运行)正在读取大量字节。然后将这些字节以文本格式保存到 SD 卡中。

目前,我将文件保存为 1, 2, 3...

但是,我需要为这些添加时间戳。

由于Panda会经常掉电,我无法使用板载时钟,也无法使用DateTime.Now 属性.

正在读取的字节还包含一个开始时间

字符串的格式类似于:

c5@!c5dcSTART 11/01/2015          12:49:12
more data.... 124 xyz
more data...
some more data...
some even more numeric/text data...
more data which include the word "START"...

目标

有没有办法检索这个开始时间?它也必须相当快,因为数据正在以一定速度读取,并且文件处理线程已经稍微滞后。

日期也需要保存为文件名,因此正斜杠可能需要替换为 "file name safe" 个替代项。

我的总体目标是在文件保存时为其添加时间戳。

我在想如果我能在 START 第一次出现后得到前 12 位数字,我 应该 能够从那里。

任何人都知道我如何在单词 'START' 之后得到 '1' 的索引?


迄今为止的尝试次数

我试过使用 String.IndexOf,然后是包含 'line' 的子字符串,然后是 trim,尽管这看起来 非常 很慢,很可能会导致数据丢失。

我也尝试过将整个消息拆分成一个 char 数组(并通过查找单词 "START",然后通过获取它后面的 'numbers'),但这也好像效率很低


更新

我最近发现我无法使用正则表达式,因为它仅针对 NetMF 4.2+ 实现,而 Fez Panda 在 4.1 上运行。

您可以使用正则表达式:

Regex r = new Regex("START\s([\d/]+)\s+([\d:])", RegexOptions.IgnoreCase);
Match m = r.Match(text);
if (m.Success) 
{
    string date = m.Groups[1].Value;  // this is the date portion
    string time = m.Groups[2].Value;  // this is the time portion
}

您也可以将模式更改为更严格:

(\d\d?/\d\d?/\d\d)\s+(\d\d?:\d\d?:\d\d?)

对第一个原始数据执行以下代码,应该会产生所需的值

 var splits = val.Split(new char[]{' ', '\t'}`)
 string date = splits[1];
 string time = splits[2];

使用 string.split("text") 然后获取数组的第二个元素(它是您要查找的字符串之后的部分并使用正则表达式 像那样:

System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase)

我最终使用了@Tigran 的 分裂的改编版,看起来像:

var x = message.IndexOf("START")+5;
string time = message.Substring(x,35);
string [] test = time.Split(new char[]{'/',':'});

然后我可以通过

访问它
test[0]+test[1]+test[2]+test[3]+test[4];

再一次,我承认这是 far 可能是解决这个问题的最低效的方法,far ,至少,看起来还可以应付。 (虽然我还是会接受Tigran的回答)。