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

本文关键字:第一个 索引 数字 之后 字符串 查找 | 更新日期: 2023-09-27 18:37:10

>背景信息

我有一个非斯熊猫II(在netmf 4.1上运行),其中正在读取大量字节。然后将这些字节以文本格式保存到SD卡中。

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

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

由于熊猫会定期断电,所以我不能使用板载时钟,也不能使用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"...

目标

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

日期还需要另存为文件名,因此可能需要将正斜杠替换为"文件名安全"替代项。

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

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

有谁知道我如何在"开始"一词后面获得"1"的索引?


迄今为止的尝试次数

我尝试使用String.IndexOf,然后是一个子字符串来包含"行",然后是修剪,尽管这看起来非常慢,并且很可能导致数据丢失。

我还尝试将整个消息拆分为字符数组(并找到单词"START",然后通过获取其后的"数字"),但这似乎也非常低效


更新

最近发现我不能使用正则表达式,因为它仅适用于 NetMF 4.2+,而 Fez Panda 在 4.1 上运行。

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

第一个原始数据上执行以下代码,应生成所需的值

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

您可以使用正则表达式:

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?)

使用 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];

再一次,我承认这可能是迄今为止解决这个问题的最低效的方法,至少到目前为止,它似乎能够应付得很好。(虽然我仍然会接受蒂格兰的回答)。