Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要正则表达式解析器的帮助-C#_C#_Regex_Parsing - Fatal编程技术网

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

需要正则表达式解析器的帮助-C#,c#,regex,parsing,C#,Regex,Parsing,我正在编写一个程序,从串口读取二进制数据流,并需要解析和格式化输入 数据是不断读取的,需要显示为完整的字符串。每个字符串的“开始代码”为3字节,“结束代码”为3字节。我需要编写一个解析器,该解析器将根据开始和结束代码查找数据——我假设正则表达式解析器就是实现这一点的方法 在过去的一两天里,我读了很多正则表达式,但它只是没有点击。帮忙 开始代码:0x160x17(不会用空格分隔) 有人能给出能找到这些值的正则表达式吗?有没有一种方法可以在c#中找到它们而不从字符串中删除它们(也就是说,在c#中不考

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

数据是不断读取的,需要显示为完整的字符串。每个字符串的“开始代码”为3字节,“结束代码”为3字节。我需要编写一个解析器,该解析器将根据开始和结束代码查找数据——我假设正则表达式解析器就是实现这一点的方法

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

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


有人能给出能找到这些值的正则表达式吗?有没有一种方法可以在c#中找到它们而不从字符串中删除它们(也就是说,在c#中不考虑它们的普通分隔符,例如string.Split())?

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

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

var buffer=新列表();
var endCode=新字节[]{3',>',0x17};
//在循环中:
字节?received=ReceiveByte()//如果没有可用的新字节,则返回null
if(字节.HasValue){
buffer.Add(已接收);
if(buffer.Skip(buffer.Count()-endCode.Length).Take(endCode.Length).SequenceEqual(endCode){
//在缓冲区中处理接收到的数据
buffer.Clear();
}
}

.NET
中的A处理Unicode字符串。处理二进制数据字节时,
Regex
将需要某种形式的Unicode解码。作为字节数组保存的数据不适合
Regex
使用。请查找有意义的(用于您的数据),或者忘记regexp引擎。

经过一些修改,这个想法非常有效。非常感谢。
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();
  }
}