使用Regex解析ASCII协议

时间:2017-10-10 11:59:46

标签: regex vb.net parsing ascii

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

将与设备进行大量交互,因此我正在寻找一种快速解析传入字符串的方法。现在,制造商非常友好地发布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>

我已经阅读了大量文档并尝试了许多方法,但是有人可以直接指出我。

然而,我确实编写了一个简单的解析器,它找到命令的索引位置和值,然后使用子字符串仅检索值。它有效,但我更喜欢&#34;更好的&#34;用正则表达式的力量。

---------编辑18-10-2017 ---------

请求@VBobCat提供更详细的解析&#34;要求。

所以,让我说我有一个包含属性FooBar的对象,我们有第二个对象,其属性为catdog

现在,当我通过telnet接收字符串时,我必须将其解析为其中一个对象。幸运的是,弦乐始终以它所拥有的为开头。因此,对于具有Foo和Bar的对象,请说x,对于具有cat和dog的对象,请说animal

现在使用提供的Regex,我想将字符串中的值解析为对象的属性。类似的东西:

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

1 个答案:

答案 0 :(得分:0)

如果您的所有样本都与您的示例一致,则可以使用:

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