Je travaille sur une application simple qui interagit avec un périphérique via une session Telnet avec un protocole ASCII.Utilisation de Regex pour analyser le protocole ASCII
Il y aura beaucoup d'interaction avec l'appareil, donc je cherche un moyen rapide d'analyser la chaîne entrante. Maintenant, le fabricant a eu la gentillesse d'y publier Regex. Mais puisque Regex est très nouveau pour moi, je ne comprends pas comment récupérer la valeur. Je sais comment faire correspondre mais quand je fais correspondre je veux obtenir la valeur de cela.
système Regex
NameAndValue := [A-Z_]+:("(\\.|[^"\\])*"|(\\.|[^\s"\\])*)
Value := ("(\\.|[^"\\])*"|(\\.|[^\s"\\])*)
ValueUnquoted := (\\.|[^\s"\\])*
ValueQuoted := "(\\.|[^"\\])*"
CharQuoted := (\\.|[^"\\])
CharUnquoted := (\\.|[^\s"\\])
EscapedChar := \\.
CharCommon := [^\s"\\]
CharEscape := \\
CharQuote := "
CharSpace := \s
Exemple d'une réponse
CMD1:"string value" CMD2:1 CMD3:"string value again" <LF> or <CR>+<LF>
J'ai lu beaucoup de documentation et beaucoup a essayé d'approches, mais quelqu'un pourrait me diriger dans le droit direct.
J'ai cependant écrit un simple analyseur qui trouve les positions d'index des commandes et de leurs valeurs, puis utilise une sous-chaîne pour récupérer uniquement la valeur. Cela fonctionne, mais je préfère un moyen "plus agréable" avec la puissance de Regex.
--------- EDIT 18-10-2017 ---------
Demande de @VBobCat pour fournir une exigence de "l'analyse" plus détaillée.
Alors disons que j'ai un objet avec les propriétés Foo
et Bar
et nous avons un deuxième objet avec les propriétés cat
et dog
Maintenant, quand je reçois la chaîne via telnet je dois analyser à un de ces objets. Heureusement, la chaîne commence toujours par ce qu'elle contient. Alors disons x
pour objet avec Foo et Bar et animal
pour objet avec chat et chien.
Maintenant, avec le Regex fourni je veux analyser les valeurs dans la chaîne pour les propriétés de l'objet. Quelque chose comme:
X CMD1_Foo:1 CMD2_Bar:"string value" <LF> or <CR>+<LF>
Object X.Foo = CMD1_Foo.value
Object X.Bar = CMD2_Bar.value
OU
Animal CMD1_Cat:"Miauw" CMD2_Dog:"woef" <LF> or <CR>+<LF>
Object X.Cat = CMD1_Cat.value
Object X.Dog = CMD2_Dog.value
Si vous avez un analyseur qui fonctionne et reconnaît la même langue , alors vous avez probablement déjà quelque chose de plus lisible qu'un tas de regex. La liste des expressions rationnelles ci-dessus semble être juste une description de la façon d'obtenir des jetons du flux, mais ne décrit pas réellement la grammaire. – Joey
Merci, mais la fonction actuelle est un peu sensible pour une position d'index spécifique. Aussi je lis partout que Regex pourrait être une méthode très rapide pour analyser les chaînes. – Gforse