IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

élaboration motif expression régulière


Sujet :

Arduino

  1. #1
    Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 215
    Points : 60
    Points
    60
    Par défaut élaboration motif expression régulière
    Bonjour

    Je souhaite créer un motif pour "matcher" ceci :
    (MMM.M NNN.N PPP.P QQQ RR.R S.SS TT.T b7b6b5b4b3b2b1b0<cr>

    MMM.M (M is an integer number ranging from 0 to 9.)
    NNN.N (N is an integer number ranging from 0 to 9.)
    PPP.P (P is an integer number ranging form 0 to 9.)
    QQQ (QQQ is a percentage)
    RR.R (R is an integer number ranging from 0 to 9.)
    SS.S or S.SS (S is an integer number ranging from 0 to 9.)
    TT.T (T is an integer number ranging form 0 to 9.)
    b7b6b5b4b3b2b1b0. Where bn is a ASCII character ‘0’ or ‘1’.
    Stop Byte : <cr>
    Example:
    (208.4 140.0 208.4 034 59.9 2.05 35.0 00110000<cr>

    J'utilise ce lien pour m'aider à préparer ma regex. :
    https://regexper.com/#R%22%28%5B%5C%...B%5Cr%5D%29%22

    Ca se rapproche de ce que je souhaite retrouver mais je ne sais pas comment élaborer la partie du motif correspondant à :
    SS.S or S.SS
    Je ne sais pas comment faire l'un ou l'autre ?

    D'autre part, j'utilise {3} pour dupliquer le motif 3 fois, mais je ne le vois reproduit que 2 fois (n-1 fois) dans la "simulation".

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Il te faut utiliser un ou (ab|bc pour ab ou bc). Éventuellement en mettant le tout dans des parenthèses. Je n'ai rien vu de tel sur le cours de guillaume, c'est une présentation rapide des regex. Il doit y avoir un cours complet sur les regex ici.

    Concernant l'écriture de la regex, tu peux simplifier [\d] en écrivant seulement \d. Idem pour [\.] qui s'écrit soit [.] soit \.. Du moment qu'il n'y a qu'un seul identifiant, les crochets ne sont pas utiles.

    D'autre part, j'utilise {3} pour dupliquer le motif 3 fois, mais je ne le vois reproduit que 2 fois (n-1 fois) dans la "simulation".
    C'est normal. Si on demande a{1}, on traverse un caractère. Pour a{2}, on le traverse 1 fois puis on recule 1 fois. Pour a{3}, on recule 2 fois. Ce qui s'affiche est le nombre de fois qu'il faut reculer, pas le nombre de fois que le motif est comptabilisé.

  3. #3
    Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 215
    Points : 60
    Points
    60
    Par défaut
    Super, merci.

    J'arrive finalement à ceci :
    R"(\((\d{3}\.\d\s){3}\d{3}\s\d{2}\.\d\s((\d{2}\.\d)|(\d\.\d{2}))\s\d{2}\.\d\s[01]{8}\r)"
    https://regexper.com/#R%22%28%5C%28%...8%7D%5Cr%29%22

    Je pense que cela correspond bien au motif recherché qui est :
    (MMM.M NNN.N PPP.P QQQ RR.R S.SS TT.T b7b6b5b4b3b2b1b0<cr>
    ou
    (MMM.M NNN.N PPP.P QQQ RR.R SS.S TT.T b7b6b5b4b3b2b1b0<cr>

    Merci pour le coup de main.

  4. #4
    Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 215
    Points : 60
    Points
    60
    Par défaut
    Bon, apparemment, pour utiliser les REGEXP avec l'IDE Arduino, il faut un motif élaboré pour LUA qui est différent de celui que j'ai préparé ("Emac standard")

    Déjà que les REGEXP ne sont pas simples à mettre en œuvre, mais si en plus il y a plusieurs "standard" !!!

  5. #5
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Oui, il y a des standards plus ou moins poussés, mais si c'est les mêmes "regexp" qu'en Lua (en minuscule, ce n'est pas un acronyme), bah, ce n'est pas des regex, mais des "patterns": https://www.lua.org/manual/5.3/manual.html#6.4.1

    La grosse limitation concerne l'absence de | (entre autres) ce qui rend le moteur simple et rapide, mais aussi limité. Autres modifications majeurs, le caractère d’échappement est % plutôt que \, et le qualifieur - existe en tant que version non-gourmande de * (*? pour les regex perl).

    Soit il faut utiliser 2 regex, soit tricher un peu avec \d[\d.]{2}\d qui accepte aussi SSSS ou S..S et faire éventuellement un post traitement.

    Tu peux donner un lien vers la doc ?

  6. #6
    Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 215
    Points : 60
    Points
    60
    Par défaut
    Je suppose que tu demandes la doc du matériel avec lequel je souhaite communiquer et dans le cas présent vérifier que l'info renvoyée est bien de la forme attendue ?

    SUMRY_RS232_Protocol.pdf

    Sinon le lien correspondant pour traiter les regexp en Arduino.
    http://www.gammon.com.au/forum/?id=11063

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Pour résoudre le problème du SS.S or S.SS, il doit être possible d'utiliser l'assertion %f[set] qui impose que la position soit suivie par un élément du set et qu'elle ne soit pas précédée par un élément du même set. Ça donnerait ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %f[0-9]([0-9][0-9][.][0-9]%f[ ])?([0-9][.][0-9][0-9])?
    Les deux formes sont mises dans des groupes optionnels. La première assertion (qui est précédée d'un espace) %f[0-9] impose qu'au moins un des deux groupes réussisse. La seconde assertion %f[ ] impose elle, en cas de réussite du premier groupe que celui-ci soit suivi d'un espace, ce qui exclut que le deuxième groupe réussisse en même temps.

    Désolé si la syntaxe est un peu brute mais j'ignore si on peut l'écrire de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %f[%d](%d{2}\.%d%f[ ])?(%d\.%d{2})?
    (Je n'ai rien pour tester, je ne sais pas si la classe %d doit s'entendre en ASCII ou en unicode, et si l'antislash est bien le caractère d'échappement pour les caractères spéciaux).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. [DATA] Condensation de motifs répétés dans une expression régulière
    Par JeromeMATHIAS dans le forum SAS Base
    Réponses: 0
    Dernier message: 13/12/2011, 10h30
  2. répétition de motif, expression régulière
    Par Jasmine80 dans le forum Langage
    Réponses: 13
    Dernier message: 08/08/2011, 14h29
  3. Réponses: 27
    Dernier message: 25/02/2010, 00h45
  4. [RegEx] Motif d'une expression régulière
    Par The Goion dans le forum Langage
    Réponses: 5
    Dernier message: 08/07/2009, 22h32
  5. [RegEx] Expression régulière et motif
    Par The Goion dans le forum Langage
    Réponses: 9
    Dernier message: 07/07/2009, 23h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo