C# - 棘手的串行原始数据必须存储到结构中

C# - Tricky serial raw data must be stored to a struct

我无法从串行服务器获取的原始数据中提取数据。 RegEx 不是我的游戏,我想转来转去……好吧,这是我的服务器响应的模板:

TIME STAMP dd/MM/YY HH:mm:ss

SAMPLING DATA IN SLOT 1 - COMS

    Dev 1

        Par 1: XXXXXX  //Signed integers
            .
            .
            .
        Par n: XXXXXX  //Signed integers
        .
        .
        .
        .
        .
    Dev n

        Par 1: XXXXXX  //Signed integers
            .
            .
            .
        Par n: XXXXXX  //Signed integers

DATA SLOT 1 SAMPLED
.
.
.
.
.
.
SAMPLING DATA IN SLOT n - COMS

    Dev n

        Par 1: XXXXXX  //Signed integers
            .
            .
            .
        Par n: XXXXXX  //Signed integers
        .
        .
        .
        .
        .
    Dev n

        Par 1: XXXXXX  //Signed integers
            .
            .
            .
        Par n: XXXXXX  //Signed integers

DATA SLOT n SAMPLED

ALL BOARDS COMPLETED

我想实现的是将上面的数据存储到Structs(C#)

以下是我取得的一些成就:

string strRegex = @"Par([^:]*): ([^\s]*)";
Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @DataStream;
foreach (Match myMatch in myRegex.Matches(strTargetString))
{
    if (myMatch.Success)
    {
        SetText(myMatch.Value + Environment.NewLine);
    }
}

DataStream = "";  

这将提取 Par n: XXXXXX

真实世界的输出是:

SAMPLING DATA IN SLOT 3 - COMS 

     Dev 1 

     Par 0: 5000 

     Par 6: 1041 

     Par 7: 1041 

     Par 8: 1032 

     Par 19: 0 

     Par 20: 0 

     Par 21: 0 

     Par 28: -2147483648 

     Par 29: -2147483648 

......

==============编辑 w/SOLUTION(伊戈尔的回答)===================== =

谢谢伊戈尔!我做了一些(愚蠢的)调整,所以它包含了 SLOT 信息。为了让其他 C# 开发人员知道,我使用了以下代码(必须检查多行):

string strRegex = @"(SLOT [0-9] - COMS )?\s*(\w+)\s+(\d+)(?::\s+(-?\d+))?\s*$";
Regex myRegex = new Regex(strRegex, RegexOptions.Multiline);

考虑使用此正则表达式来解析 'real world output':^\s*(\w+)\s+(\d+)(?::\s+(-?\d+))?\s*$

它不会匹配空行和状态消息。 以下是其余的分组:

Input                                    
'     Dev 1 '                 'Dev'  '1'     ''
'     Par 0: 5000 '           'Par'  '0'     '5000'
'     Par 6: 1041 '           'Par'  '6'     '1041'
'     Par 7: 1041 '           'Par'  '7'     '1041'
'     Par 8: 1032 '           'Par'  '8'     '1032'
'     Par 19: 0 '             'Par'  '19'    '0'
'     Par 20: 0 '             'Par'  '20'    '0'
'     Par 21: 0 '             'Par'  '21'    '0'
'     Par 28: -2147483648 '   'Par'  '28'    '-2147483648'
'     Par 29: -2147483648 '   'Par'  '29'    '-2147483648'

如果您打算熟悉正则表达式,this is good starting point

干杯!