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

C# Discussion :

Expression regulière c#


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Expression regulière c#
    Bonjour,

    je n'arrive pas à trouver l'expresion réguliere de
    "\r\n^SISR: 1, XXXX\r\n"; avec XXXX nombre compris entre 0 et 1500.

    J'ai essayé cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String patern = "\r\n^SISR: 1, [0-1500]\r\n";
    Regex myRegex = new Regex(patern);
    mais sans succès

    Merci par avance.

    Cordialement,

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 766
    Points
    766
    Par défaut
    Le plus simple c'est de capturer le nombre et ensuite vérifier s'il est dans ton intervalle.

    Je suis déjà tombé sur une explication pour trouver des intervalles avec les ER, ça n'avait pas l'air facile...

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Tu vas te prendre la tête si tu essaies de matcher des patterns sur plusieurs lignes... Lis plutôt ton fichier ligne par ligne, et teste chaque ligne pour voir si elle match.

    D'autre part, "[0-1500]" n'est pas un range valide : 1500 n'est pas un caractère... tu pourrais dire "[0-9]+" pour accepter 1 chiffre ou plus, mais ça n'a pas tout à fait le même sens. Les expressions régulière ne permettent pas (du moins pas facilement) de contrôler la valeur d'un nombre : c'est un outil qui sert à traiter du texte, pas des nombres...

    Cela dit, en bidouillant un peu, on peut s'en sortir avec un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "^SISR: 1, (1500|1[0-4][0-9]{2}|[0-9]{1,3})$"
    En gros, on teste séparément les 3 cas possibles :
    1500 : la valeur 1500
    1[0-4][0-9]{2} : le premier chiffre est 1, le second entre 0 et 4, les 2 derniers entre 0 et 9 (valeurs de 1000 à 1499)
    [0-9]{1,3} : entre 1 et 3 chiffres de 0 à 9 (valeurs de 0 à 999)

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    +1, ta solution est très propre, perso j'aurai fait un bon vieux Split sur la virgule xD

    ce serait intéressant de comparer les vitesses de traitement...

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci, pour cette réponse +1
    Je manipule des bytes que je réceptionne via la liaison série, et pour reconstituer mon fichier je dois supprimer les réponses du modem (commande AT). Je ne vois pas d'outils à 1ere vue, pour la suppression des réponses du modem (chaine de caractère) dans un tableau de bytes. Du coup j'essaye de gérer avec un BinaryWriter et la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.Text.Encoding.ASCII.GetBytes();
    Existe t-il d'autre solution plus simple ?

    Merci par avance

    Cordialement,

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Je comprends pas trop ton dernier message... pourquoi transformer le texte en tableau de bytes ? C'est plus simple à gérer sous forme de chaine, non ?

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par Arnard Voir le message
    ce serait intéressant de comparer les vitesses de traitement...
    Les RegEx (même si elles ont au demeurant beaucoup d'interêt) n'ont pas, en général, la rapidité d'exécution comme qualité principale.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Je comprends pas trop ton dernier message... pourquoi transformer le texte en tableau de bytes ? C'est plus simple à gérer sous forme de chaine, non ?
    le flux de bytes reçu correspond à un fichier *.exe reçu par packet compris entre 0-1500 octets suivant la disponibilité d'un serveur. Si je récupère directement ces données via un String par la méthode serialPort1.ReadTo("XXX"); mes données sont automatiquement encoder en UTF-8.
    Du coup je travail uniquement avec la méthode serialPort1.Read("") qui me renvoi les données brutes sans encodage me permettant ainsi de garder la bonne image de fichier source. Mais si il existe une solution avec la manipulation de String, une idée je suis preneur

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    OK... mais alors dans ce cas je suis pas sûr de comprendre le rapport avec la question du début
    Chaque début de paquet est indiqué par le texte "SISR...", c'est ça ?

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par tomlev Voir le message
    OK... mais alors dans ce cas je suis pas sûr de comprendre le rapport avec la question du début
    Je me sens moins seul ....

    Car voir un rapport entre un fichier .exe et des traitements de regex, j'ai beau chercher ...

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tomlev Voir le message
    OK... mais alors dans ce cas je suis pas sûr de comprendre le rapport avec la question du début
    je voulais exploiter la solution avec traitement uniquement de chaine de caractères mais à cause de l'encodage lors de la conversion en string, qui me fausses mes données, j'ai opté pour une autre solution sans les expressions régulières...

    Citation Envoyé par tomlev Voir le message
    Chaque début de paquet est indiqué par le texte "SISR...", c'est ça ?
    En gros je communique avec un modem GSM/GPRS via rs232, j'ai une 1ere fonction qui me permet de le configurer et de lui dire ou aller chercher le fichier source (ftp), ensuite je vérifie si la connexion est établie. Puis je fait des demandes de lecture de packet d'octets au serveur (via le modem) avec l'instruction : at^sisr=1,1500\r (demande de 1500 octets sur la connection 1) le serveur me répond par "\r\n^SISR: 1, xxxx\n\r" xxxx le nombre d'octet renvoyé suivi des octets en questions puis "\r\nOK\n\r". Moi je récuperer mes packets dans un BinaryStream pour reformer mon fichier source entre temps je supprime les trames de réponses du modem.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    OK... dans ce cas je pense que la solution la plus "simple" est de récupérer manuellement les premiers bytes dans un tableau jusqu'au 2e "\r\n". Quand tu as récupéré cette partie, tu la convertis en string, et tu en extrais la longueur. Et enfin tu lis le nombre d'octets spécifiés à partir du flux

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tomlev Voir le message
    OK... dans ce cas je pense que la solution la plus "simple" est de récupérer manuellement les premiers bytes dans un tableau jusqu'au 2e "\r\n". Quand tu as récupéré cette partie, tu la convertis en string, et tu en extrais la longueur. Et enfin tu lis le nombre d'octets spécifiés à partir du flux
    Existe t-il une librairie ou bien une fonction permettant de remplacer des bytes dans un fichier binaire ?

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par redz1 Voir le message
    Existe t-il une librairie ou bien une fonction permettant de remplacer des bytes dans un fichier binaire ?
    Pas à ma connaissance, mais à quoi ça servirait ? Tu cherches à extraire des données d'un flux d'octets, je ne vois en quoi ça implique de remplacer quoi que ce soit...

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Pas à ma connaissance, mais à quoi ça servirait ? Tu cherches à extraire des données d'un flux d'octets, je ne vois en quoi ça implique de remplacer quoi que ce soit...
    Une méthode: identifier les données à supprimer pour les remplacer par "" (null). Ainsi on supprime les réponses du modem.

Discussions similaires

  1. Recherche recursive à l'aide des expressions reguliére
    Par titoff dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/12/2005, 16h42
  2. [RegEx] aide pour une expression regulière
    Par hugo123 dans le forum Langage
    Réponses: 5
    Dernier message: 24/11/2005, 15h41
  3. ET dans une expression regulière
    Par kesako dans le forum Langage
    Réponses: 4
    Dernier message: 10/11/2005, 12h57
  4. Problème expression regulière ??
    Par panaone dans le forum Langage
    Réponses: 5
    Dernier message: 18/08/2005, 13h41
  5. Variables et Expression Regulière
    Par Temari dans le forum Langage
    Réponses: 5
    Dernier message: 05/08/2005, 01h55

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