私は、ASCIIベースのプロトコルを使ってTelnetセッションを介してデバイスとやりとりする簡単なアプリケーションに取り組んでいます。Regexを使ってASCIIプロトコルを解析する
デバイスとのやりとりがたくさんあるので、入ってくる文字列を高速に解析する方法を探しています。今、メーカーはRegexスキームをリリースするのにとても親切でした。しかし、Regexは私にとって非常に新しいので、私は値を取得する方法を理解していません。私はどのように一致するか知っているが、私はそれから値を取得したいと一致するとき。応答の
正規表現スキーム
NameAndValue := [A-Z_]+:("(\\.|[^"\\])*"|(\\.|[^\s"\\])*)
Value := ("(\\.|[^"\\])*"|(\\.|[^\s"\\])*)
ValueUnquoted := (\\.|[^\s"\\])*
ValueQuoted := "(\\.|[^"\\])*"
CharQuoted := (\\.|[^"\\])
CharUnquoted := (\\.|[^\s"\\])
EscapedChar := \\.
CharCommon := [^\s"\\]
CharEscape := \\
CharQuote := "
CharSpace := \s
例Iは、文書をたくさん読んで、たくさんのアプローチのを試してみた
CMD1:"string value" CMD2:1 CMD3:"string value again" <LF> or <CR>+<LF>
、しかし誰かが右、直接に私を指摘することができます。
しかし、私は、コマンドとその値のインデックス位置を見つけて、部分文字列を使用して値だけを取得する単純なパーサーを作成しました。それは動作しますが、私はRegexの力で "より良い"方法を好みます。
--------- EDIT 18-10-2017 ---------
より詳細な "構文解析" の要件を提供するために、@VBobCatのリクエスト。
それでは、私はプロパティFoo
とBar
を持つオブジェクトを持っていると私はTelnet経由の文字列を受信したとき、我々は、私はそれらのいずれかにそれを解析する必要が今のプロパティcat
とdog
との第2の目的を持っているとしましょうオブジェクト。幸いなことに、文字列は常にその文字列で始まります。したがって、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
あなたは同じ言語を動作し、認識パーサを持っている場合おそらく、すでに正規表現の束よりも読みやすいものがあるでしょう。上の正規表現のリストは、ストリームからトークンを取得する方法の説明にすぎませんが、実際には文法を記述するものではありません。 – Joey
ありがとうございますが、現在の関数は、特定のインデックス位置に対してちょっと敏感です。また、私はRegexが文字列を解析する非常に高速なメソッドである可能性がどこでも読んでいます。 – Gforse