使用正则表达式来解析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的,以提供更详细的 “解析” 的规定。
所以我们可以说我有属性Foo
和Bar
一个对象,我们与性质cat
和dog
第二对象现在,当我通过telnet接收字符串我必须把它解析到其中的一个对象。幸运的是,琴弦总是从它所拥有的东西开始。因此,让对象与Foo和酒吧说x
和animal
为猫和狗的对象。
现在用提供的正则表达式我想解析字符串中的值到对象的属性。喜欢的东西:
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
如果所有的样品都与你一致。例如,这可能是工作:
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
感谢您的功能。看起来很有希望。我用不同的正则表达式函数和你的函数做了一些测试,并记录了速度。对于测试,它每个功能循环500次。结果如下: – Gforse
这就是结果:Split Func:6619,7564 Match Func:12105,4255 Matches Func:11945,3395 ParseTelnet Func:1023,5577正如你所看到的,你的功能非常快。但它确实存在缺陷,它不会删除换行符。 Als如何重建此代码以将字符串解析为对象。该协议有不同类型的命令,导致不同的对象。字符串中的前3个字符定义为 – Gforse
@Gforse,你可以编辑你的问题发布一个更长的样本,并准确定义你想如何分组数据?也就是说,你希望每一行都是一个独立的实体吗? – VBobCat
如果你有工作,并确认相同的语言解析器,那么你可能已经拥有比一堆正则表达式更可读的东西了。上面的正则表的列表似乎只是如何从流中获取令牌的描述,但实际上并没有描述语法。 – Joey
谢谢,但目前的功能对特定索引位置有点敏感。另外,我在任何地方都能看到,Regex可能是一种解析字符串的非常快速的方法。 – Gforse