【问题标题】:Need help with a regular expression parser - C#需要正则表达式解析器的帮助 - C#
【发布时间】:2009-10-02 15:08:34
【问题描述】:

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

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

在过去的一两天里,我读了一堆正则表达式,但只是没有点击。帮忙?

起始码:0x16 0x17(不会用空格隔开)

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

【问题讨论】:

    标签: c# regex parsing


    【解决方案1】:

    如果只是简单地匹配几个字节值,您可以考虑编写一个简单的有限状态机来匹配开始和结束。更容易测试和表示为代码。

    【讨论】:

      【解决方案2】:

      我认为在这种情况下,正则表达式是多余的。我只会在数据字节到达时对其进行缓冲,并在收到每个字节后检查是否以您的结束代码结尾。大概是这样的(即时编写,不要只是粘贴和编译):

      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();
        }
      }
      

      【讨论】:

      • 经过一些修改,这个想法非常有效。非常感谢。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-30
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 2012-03-09
        • 2021-08-29
        • 1970-01-01
        相关资源
        最近更新 更多