查找 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 上运行。
第一个原始数据上执行以下代码,应生成所需的值
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];
再一次,我承认这可能是迄今为止解决这个问题的最低效的方法,至少到目前为止,它似乎能够应付得很好。(虽然我仍然会接受蒂格兰的回答)。