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

时间:2015-01-12 16:07:42

标签: c# string datetime .net-micro-framework

背景资讯

我有fez panda 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'在“START'”之后?


尝试约会

我已尝试使用String.IndexOf,然后使用子字符串来包含'行',然后进行修剪,尽管这似乎慢并且很可能导致丢失了数据。

我也尝试将整个消息拆分成一个char数组(然后通过查找单词" START"然后继续获取'数字'之后) ,但这似乎也是非常低效的


更新

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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?)

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我最终使用@ Tigran&{39}分裂的改编,看起来像:

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

再一次,我承认这是可能是解决此问题的最低效方式, 到目前为止 ,至少,似乎能够应付ok-ish。 (虽然我仍会接受Tigran的回答)。