使用正则表达式来解析ASCII协议

问题描述:

我正在研究一个简单的应用程序,该应用程序通过基于ASCII协议的Telnet会话与设备进行交互。使用正则表达式来解析ASCII协议

会有很多与设备的交互,所以我正在寻找一种快速的方式来解析传入的字符串。现在制造商非常善良地发布了Regex方案。但由于正则表达式对我来说很新,我不明白如何检索这个值。我知道如何比赛,但是当我比赛时我想从中获得价值。

正则表达式方案

NameAndValue := [A-Z_]+:("(\\.|[^"\\])*"|(\\.|[^\s"\\])*) 
Value := ("(\\.|[^"\\])*"|(\\.|[^\s"\\])*) 
ValueUnquoted := (\\.|[^\s"\\])* 
ValueQuoted := "(\\.|[^"\\])*" 
CharQuoted := (\\.|[^"\\]) 
CharUnquoted := (\\.|[^\s"\\]) 
EscapedChar := \\. 
CharCommon := [^\s"\\] 
CharEscape := \\ 
CharQuote := " 
CharSpace := \s 

响应

CMD1:"string value" CMD2:1 CMD3:"string value again" <LF> or <CR>+<LF> 

的例子中,我阅读了大量的文档,并试图办法很多的,但是有人可以点我出去在右侧直接。

但是我写过一个简单的解析器,它可以查找命令的索引位置,然后使用子字符串检索唯一的值。它的工作原理,但我更喜欢与正则表达式的力量“更好”的方式。

--------- EDIT 18-10-2017 ---------

请求@VBobCat的,以提供更详细的 “解析” 的规定。

所以我们可以说我有属性FooBar一个对象,我们与性质catdog

第二对象现在,当我通过telnet接收字符串我必须把它解析到其中的一个对象。幸运的是,琴弦总是从它所拥有的东西开始。因此,让对象与Foo和酒吧说xanimal为猫和狗的对象。

现在用提供的正则表达式我想解析字符串中的值到对象的属性。喜欢的东西:

X CMD1_Foo:1 CMD2_Bar:"string value" <LF> or <CR>+<LF> 
Object X.Foo = CMD1_Foo.value 
Object X.Bar = CMD2_Bar.value 

OR

Animal CMD1_Cat:"Miauw" CMD2_Dog:"woef" <LF> or <CR>+<LF> 
Object X.Cat = CMD1_Cat.value 
Object X.Dog = CMD2_Dog.value 
+0

如果你有工作,并确认相同的语言解析器,那么你可能已经拥有比一堆正则表达式更可读的东西了。上面的正则表的列表似乎只是如何从流中获取令牌的描述,但实际上并没有描述语法。 – Joey

+0

谢谢,但目前的功能对特定索引位置有点敏感。另外,我在任何地方都能看到,Regex可能是一种解析字符串的非常快速的方法。 – Gforse

如果所有的样品都与你一致。例如,这可能是工作:

Function ParseTelnet(input As String) As DataTable 
    Dim retTable As New DataTable 
    retTable.Columns.Add("command", GetType(String)) 
    retTable.Columns.Add("value", GetType(String)) 
    Dim entries = System.Text.RegularExpressions.Regex.Split(input, "\s+(?=\w+:)") 
    Dim pairs = entries.Select(
     Function(entry) If(entry, "").Trim(Chr(9), Chr(10), Chr(13), Chr(32)).Split({":"c}, 2)).Where(
     Function(pair) pair.Count = 2) 
    For Each pair In pairs 
     If pair(1).StartsWith("""") AndAlso pair(1).EndsWith("""") Then 
      retTable.Rows.Add(pair(0), pair(1).Substring(1, pair(1).Length - 2)) 
     Else 
      retTable.Rows.Add(pair(0), pair(1)) 
     End If 
    Next 
    Return retTable 
End Function 
+0

感谢您的功能。看起来很有希望。我用不同的正则表达式函数和你的函数做了一些测试,并记录了速度。对于测试,它每个功能循环500次。结果如下: – Gforse

+0

这就是结果:Split Func:6619,7564 Match Func:12105,4255 Matches Func:11945,3395 ParseTelnet Func:1023,5577正如你所看到的,你的功能非常快。但它确实存在缺陷,它不会删除换行符。 Als如何重建此代码以将字符串解析为对象。该协议有不同类型的命令,导致不同的对象。字符串中的前3个字符定义为 – Gforse

+0

@Gforse,你可以编辑你的问题发布一个更长的样本,并准确定义你想如何分组数据?也就是说,你希望每一行都是一个独立的实体吗? – VBobCat