我正在研究一个简单的应用程序,该应用程序通过基于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;要求。
所以,让我说我有一个包含属性Foo
和Bar
的对象,我们有第二个对象,其属性为cat
和dog
现在,当我通过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
答案 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