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 :

[RegEx] Trouver la chaine rejetée


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 13
    Points
    13
    Par défaut [RegEx] Trouver la chaine rejetée
    Bonjour,

    [Pour info]

    La chaine ci-dessous constitue un message dont chaque ligne est appelée segment identifié par les 3 premiers caractères.
    Certains segments sont répétables,optionnels et peuvent aussi être regroupés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MSH|^~\&|SRLMED|BPTRU|CIT|PROFIL<CR>
    SFT|1|MP0245|PP2548||JEAN^JACQUES<CR>
    MSA|1|R2578|R264|ECO^ECOGRAPHIE|<CR>
    Je souhaiterai vérifier qu'un message est bien constitué d'une suite définie de segments. J'ai donc crée une expression réguliere relative à mon message et j'ai testé une chaine constitée de la concaténation des 3 premiers caracteres de chaque ligne.
    Ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    string text1 = "MSHSFTMSA";
    string text2 = "MSZSFTMSA";
    string pat = @"(MSH)(SFT)(MSA)+(ERR)*";
     
    Regex r = new Regex(pat);
    Match m = r.Match(text1);
    if (m.Success)
       Console.WriteLine("message ok");
    else
       Console.WriteLine("message pas ok");
    test1 vérifie bien mon expression réguliére mais pas test2 à cause du Z.
    Comment faire pour récupérer la cause du non matching de la chaine et idéalement la position du bloc en erreur?

    J'ai beau chercher via les différents tuto mais je vois pas comment faire...

    Si vous avez des idées quitte à faire sans les expression régulières, je suis preneur mais vu la complexité de certains messages je préférerai utiliser les Regex...

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    J'ai vu dans un autre post qu'il était possible de trouver la/les chaines d'exclusion en testant la chaine sur la regex inverse.

    N'étant pas calé en RegEx (et je suis gentil ), pourriez-vous me filer un coup de main?

    En gros, voila ce que je suis sensé pouvoir inverser de manière dynamique:

    EX1:
    (MSH)(SFT)*(MSA)(ERR)*


    EX2:
    (DG1)*(DRG)?((PR1)(ROL)*)*(GT1)*


    j'ai vu que pour exclure des caractéres, on pouvait faire "[^ABC]" mais je n'ai pas trouvé comment exclure une chaine.

  3. #3
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Une idée qui me vient : tu pourrais faire un replace de chaque symbole par une chaîne vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Regex.Replace(text1, "(MSH|SFT|MSA|ERR)", "");
    // Renvoie chaîne vide
    Regex.Replace(text2, "(MSH|SFT|MSA|ERR)", "");
    // Renvoie "MSZ"
    Qu'en penses-tu ?

    Attention, le pattern que je donne ici ne tient pas compte de l'ordre relatif des identifiants.
    C'est une idée à approfondir car en s'y penchant un peu plus, il y a de nombreux cas particuliers à gérer.

    Ceci dit, je pense que le plus simple serait de faire ça séquenciellement, puisque l'ordre doit être respecté. Tu pourrais faire les vérifications segment par segment au lieu de concaténer tous les identifiants.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    N'ayant pas le temps d'approfondir la chose, j'ai été contraint de laisser tomber la recherche de chaine rejetée.
    Je regarderai plus tard...

Discussions similaires

  1. Regex: trouver une chaine et prendre le mot d'aprés
    Par Greg84 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 07/11/2008, 14h41
  2. Réponses: 4
    Dernier message: 11/12/2007, 11h34
  3. Réponses: 4
    Dernier message: 03/01/2007, 10h39
  4. Trouver la chaine commune
    Par Anduriel dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2006, 18h49
  5. [Regex] Recherche sous chaine, debutant
    Par Tekone dans le forum Langage
    Réponses: 1
    Dernier message: 14/06/2006, 00h18

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