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

Langage Perl Discussion :

REGEX et Point virgule dans un texte ;;-)


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Septembre 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 11
    Par défaut REGEX et Point virgule dans un texte ;;-)
    Bonjour à tous,

    Je me permets de poster un petit message, car j'ai besoin de vos lumière concernant une expression régulière.

    En bref j'ai un fichier de ce type:
    ====
    002;;;;;;;;
    002;0201;10.160.2.129;1.160.2.162;1.160.2.166;10.160.2.167;10.160.2.168;10.160.2.169;
    002;0202;10.160.3.1;1.160.3.34;10.160.3.38;10.160.3.39;10.160.3.40;10.160.3.41;
    002;0204;10.160.3.129;1.160.3.162;1.160.3.166;10.160.3.167;10.160.3.168;10.160.3.169;
    002;0209;10.160.4.1;10.160.4.34;1.160.4.38;10.160.4.39;10.160.4.40;10.160.4.41;
    002;0210;10.160.4.129;10.160.4.162;10.160.4.166;10.160.4.167;10.160.4.168;10.160.4.169;
    002;0211;10.160.5.1;10.160.5.34;1.160.5.38;10.160.5.39;10.160.5.40;10.160.5.41;
    002;0213;10.160.5.129;10.160.5.162;10.160.5.166;10.160.5.167;10.160.5.168;10.160.5.169;
    002;0218;1.160.6.1;1.160.6.34;1.160.6.38;10.160.6.39;10.160.6.40;1.1.6.41;
    ====================


    Voici les expressions régulières testées:

    ========REGEX 1
    if (($Ligne_Fichier) =~ (m/(\d{3})";"\d{4}.*/))
    ========

    ========REGEX 2
    if ( ($Ligne_Fichier)=(($Ligne_Fichier) =~ m/.*[^;;].*/))
    ========

    Le but étant de parcourir chaque ligne du fichier indiqué précédemment et de sélectionner toutes celles qui ne contiennent pas deux points virgules d'affilé.
    J'ai fais plusieur tests mais sans y arriver.
    A+
    Julien

  2. #2
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Salut !

    Comme ca je dirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (<FILE>) {
    print unless /\;{2}/;
    }
    @+
    Mr6

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 11
    Par défaut
    Ok Merci MR6, pour la rapidité d'entre aide. Génial.

    Cependant concernant ta solution pourquoi est ce que cette expression provoque une erreur :

    =========
    if ( ($Ligne_Fichier)=(($Ligne_Fichier) =~ m/.*[^;;].*/))
    =========

    Est ce que le point virgule est un caractère spécial ?

    Merci d'avance.
    Jules

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    La syntaxe [^;;] défini une liste de caractère, pas une suite de caractère.
    Tu définis donc "n'importe quel caractère autre que ceux donnés entre ^ et ], en l'occurrence, tous les caractères sauf le point virgule, ce qui ne répond pas du tout à ton besoin.

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 11
    Par défaut
    Ok merci pour cette information précieuse et qui change la donne.
    Ca m'évoque deux questions :

    Question 1:

    if (($Ligne_Fichier) =~ (m/(\d{3});(\d{4};(\d+)\.(\d+)\.(\d+)\.(\d+);(\d+)\.(\d+)\.(\d+)\.(\d+);(\d+)\.(\d+)\.(\d+)\.(\d+);(\d+)\.(\d+)\.(\d+)\.(\d+);(\d+)\.(\d+)\.(\d+)\.(\d+);(\d+)\.(\d+)\.(\d+)\.(\d+);/))
    erreur de compilation : Unmatched ( in regex ; marked by here ........etc

    Question 2:

    Comment traduire mon expression régulière pour dire : dès que contient deux point virgule d'affiler je ne prends pas ?

    Cordialement,
    Jules

  6. #6
    Membre chevronné Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Par défaut
    Bonjour,

    Question 1 : il te manque une parenthèse fermante juste après le "\d{4}"

    Ceci résout ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($line =~ (m/(\d{3});(\d{4});(\d+)\.(\d+)\.(\d+)\.(\d+);(\d+)\.(\d+)\.(\d+)\.(\d+);(\d+)\.(\d+)\.(\d+)\.(\d+);(\d+)\.(\d+)\.(\d+)\.(\d+);(\d+)\.(\d+)\.(\d+)\.(\d+);(\d+)\.(\d+)\.(\d+)\.(\d+);/))
    NB : ca fait long la regexp : tu peux facilement la réduire en regroupant des repétitions tout en pouvant capturer tous les éléments

    Question 2 :
    Il existe plein de façon (cf Mr6) ou encore avec des [^] . En voici une autre qui consite à ne pas traiter une ligne qui contient deux points-virgules à la suite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if($line !~ /;{2}/)

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

Discussions similaires

  1. REGEX : ajout de liens dans un texte HTML
    Par Tororo73 dans le forum Langage
    Réponses: 2
    Dernier message: 24/06/2011, 12h46
  2. Calculer de nombre de point virgules dans un fichier
    Par delilou dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 28/03/2011, 17h53
  3. Instruction point-virgule dans mon programme.
    Par katcha95 dans le forum Débuter
    Réponses: 8
    Dernier message: 28/11/2009, 15h06
  4. point virgule dans export fichier texte
    Par Ludwik dans le forum VBA Access
    Réponses: 8
    Dernier message: 21/04/2009, 21h46
  5. lire le point-virgule dans un fichier .ini
    Par juflata dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 05/07/2004, 12h46

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