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 :

[RegExp] Elément facultatif + Validation de l'expression.


Sujet :

C#

  1. #1
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut [RegExp] Elément facultatif + Validation de l'expression.
    Bonjour @ tous,

    J'utilise les expression régulière afin de parsé un fichier texte. Commençons par un extrait du fichier :
    INVITE sip:aamj@10.193.137.10 SIP/2.0
    Route: <sip:10.193.137.10;lr>
    Via: SIP/2.0/UDP 10.193.137.17:5060;branch=z9hG4bKfci84h186phc7mra04dvhno;rport
    From: <sip:coco@toto.fr>;tag=ud284h4bflhc6vg904dv
    To: <sip:aamj@10.193.137.10>
    Mon but est de repérer la première ligne du fichier qui est différente des autres. En effet elle est toujours de cette forme :
    * sip:*@Adresse_IP[: Port] SIP/2.0
    J'ai entre crochet port car il falcutaltif. (l'espace n'est que pour éviter l'émoticone constitué de : et de P)
    Si on observe les autres lignes, elles sont du genre :
    *: *
    Et le Hic c'est que ma première ligne peut se retrouver en deuxième, troixième, ou xième lignes.

    Donc je me suis construit une expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?!SIP/2.0)[a-zA-Z]* [0-9a-zA-Z]*:[a-zA-Z]*\\@([0-9]{1,3}\\.){3}[0-9]{1,3}:[0-9]* SIP/2.0
    Bon ok il y a certainement mieux, mais je pensais qu'elle marchait tout le temps, hors elle ne fonctionne pas avec le texte que je vous ai donné.

    Pour comparé, avec le texte suivant, elle fonctionne :
    INVITE sip:service@127.0.0.1:5060 SIP/2.0
    Via: SIP/2.0/UDP 127.0.0.1:5061
    From: sipp <sip:sipp@127.0.0.1:5061>;tag=1
    To: sut <sip:service@127.0.0.1:5060>
    Call-ID: 1.3292.127.0.0.1@sipp.call.id
    La grande différence se situe au niveau port facultatif, qui est présent dans ce fichier. Donc je pense qu'il faut que je dise dans mon expression, juste après l'adresse IP "([0-9]{1,3}\\.){3}[0-9]{1,3}" que ":[0-9]*" peut être facultatif.

    Je vais chercher demain parce que là je vais rentrer chez moi , mais si vous avez la solution n'hésitez pas à me la donner, cela fera un heureux.

    Ensuite, est ce que les pro en regexp pourrait me dire s'il y a mieux ou si l'expression marchera tout le temps ?

    Merci par avance pour votre aide, et pour m'avoir lu.

    Ced600.

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Bon j'ai abandonné l'idée de faire une regexp, je suis passé par l'analyse des caractères par caractères. C plus simple en fait et cela reste rapide

  3. #3
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Vu que la forme de la chaîne est figée
    n'aurait pas suffit ?

    Sinon tu peux utiliser ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .*sip:.*@(?:\d{1,3}\.){3}\d{1,3}(?::\d{1,5})?\sSIP/2.0
    Cela fonctionne avec tes 2 exemples

    Pour une adresse IPv4 valide, si tu as besoin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Merci pour la réponse.

    En fait le bug que j'ai m'a fait prendre conscience d'une chose :

    Si j'utilise ce genre de chose :
    Je suis en train de faire un test de structure. Mais mon but est de récupérer les éléments du fichier en faisant le moins de test de structure possible.
    Je ne peux pas supprimer tout test de structure, car je suis obligé de me baser sur une structure pour récupérer des éléments spécifiques.

    De toute façon je teste après les lignes que j'ai récup et la structure du message, donc si j'ai mal récupéré les infos, je sortirais à un moment en "erreur".

    Bref pour limité les tests dans la phase de récupération du contenu du fichier je me suis dit que le mieux était de testé les caractères de début de ligne jusqu'au ':' (ou fin de ligne pour éviter les surprise) . Si j'ai un espace avant le ':' ou que j'arrive à la fin de ligne, je suis du type : "INVITE sip:aamj@10.193.137.10 SIP/2.0" sinons je suis du type : "Route: <sip:10.193.137.10;lr>"

    Bref j'autorise ainsi plus d'erreur dans la structure du message, et je peux ainsi affiner mon analyse

    Merci quand même, j'utilise les expression régulière à d'autre endroit pour tester la structure, ta réponse me servira d'exemple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/03/2012, 10h54
  2. validation par une expression régulière
    Par TaymouWan dans le forum C#
    Réponses: 4
    Dernier message: 21/04/2009, 16h41
  3. [RegEx] Test validé d'une expression régulière
    Par nek_kro_kvlt dans le forum Langage
    Réponses: 3
    Dernier message: 18/02/2009, 13h46
  4. [Custom Tags 2.0] Elément facultatif, comment sont ils gérés.
    Par zulot dans le forum Taglibs
    Réponses: 1
    Dernier message: 03/12/2008, 22h08
  5. validator tomahawk et expression regulière
    Par outhman83 dans le forum JSF
    Réponses: 3
    Dernier message: 19/11/2008, 18h00

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