需要有关正则表达式解析器的帮助 - C#

时间:2009-10-02 15:08:35

标签: c# regex parsing

我正在开发一个程序,它从串口读取二进制数据流,需要解析和格式化输入。

数据不断读取,需要显示为完整字符串。每个字符串具有3个字节的“起始码”和3个字节的“结束码”。我需要编写一个解析器,它将根据开始和结束代码找到数据 - 我假设一个正则表达式解析器是这样做的方法。

我在最后一两天读了一堆正则表达式,但它只是没有点击。帮助

开始代码:0x16< 0x02(不会被空格分隔) 结束代码:0x03> 0x17(不会被空格分隔)

任何人都可以给出能找到这些值的正则表达式吗?有没有办法在c#中找到它们而不从字符串中删除它们(即不考虑它们中的正常分隔符,例如String.Split())?

3 个答案:

答案 0 :(得分:1)

如果它只是匹配几个字节值,你可以看一下编写一个简单的有限状态机来匹配开始和结束。更容易测试并代表代码。

答案 1 :(得分:0)

在这种情况下,我认为正则表达式是过度的。我只是在数据字节到达时缓冲它们,并在收到每个字节后检查是否以您的结束代码结束。大致相似的东西(即时编写,不只是粘贴和编译):

var buffer=new List<byte>();
var endCode=new byte[] {3, '>', 0x17};

// In a loop:

byte? received=ReceiveByte(); //Return null if no new byte available
if(byte.HasValue) {
  buffer.Add(received);
  if(buffer.Skip(buffer.Count()-endCode.Length).Take(endCode.Length).SequenceEqual(endCode){
    //Process the received data in buffer
    buffer.Clear();
  }
}

答案 2 :(得分:0)

.NET中的Regex处理 Unicode 字符串。处理二进制数据字节时,Regex需要某种形式的解码到 Unicode 。保存为字节数组的数据不适合Regex使用。要么找到有意义的(对于您的数据)Encoding,要么忘记正则表达式引擎。