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 :

Besoin d'être sûr de ma RegExp


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 612
    Par défaut Besoin d'être sûr de ma RegExp
    Bonjour,

    pour les besoins d'un script professionnel, je dois lire des lignes issues d'un fichier texte et faire ressortir la condition VRAIE si la chaîne recherchée se trouve dans la-dite ligne.

    Exemple de lignes du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    01.040.29*27.120
    33.100*13*17.100
    45.080*13.160.40*97.220
    ATTENTION : * est un séparateur de données !

    J'ai 2 RegExp selon les cas de figure :

    1) je dois trouver une donnée commençant par 13

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FAUX -> 01.040.13*27.120
    VRAI -> 33.100*13*17.100
    VRAI -> 45.080*13.160.40*97.220
    Ma RegExp : /\*?13.*/

    2) je dois trouver une donnée commençant par 13.160

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FAUX -> 01.040.13*27.120
    FAUX -> 33.100*13*17.100
    VRAI -> 45.080*13.160.40*97.220
    Ma RegExp : /\*?13\.160.*/

    Le soucis pour que tout soit nickel, c'est qu'il ne faut surtout pas, si je prend la ligne 1 pour exemple, que mon script me retourne VRAI parce qu'il a topé sur la ligne "01.040.13"

    Et le problème, c'est que ma 1ère RegExp /\*?13.*/ va toper comme VRAI la donnée "01.040.13".

    Si qqun pouvait me donner un p'tit coup d'pouce pour affiner tout ça ?


  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Salut,

    essaie ça et ça 13 peut être au début de la ligne?
    Dans ton cas on peut dire qu'on utilise * comme ancrage?

    Si tu mets \*? alors l'étoile est optionnelle. Mais comme ? est avide la reconnaissance sera tentée. Et si étoile n'est pas réconnu alors tu risque de reconnaître aussi 13 après le point .


    Prenons ton cas
    /\*?13.*/ va toper comme VRAI la donnée "01.040.13".
    \*? - comme ? est avide alors il va tenter la reconnaissance de * mais il va garder en mémoire l'emplacement avant 13 (donc après le point).
    Comme la reconnaissance de l'étoile ne peux par réussir la regex aura un échec. Mais ce n'est pas un échec totale puisque ? est optionnelle.
    Donc la reconnaissance va continuer avec l'emplacement avant le 13. Comme 1 suit de 3 sont reconnus la regex va annoncer un succés.


    lami20j

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 612
    Par défaut
    Citation Envoyé par lami20j
    13 peut être au début de la ligne?
    Dans ton cas on peut dire qu'on utilise * comme ancrage?
    Oui, 13 peut se trouver en début de ligne

    Pour tout dire, chaque ligne correspond à un enregistrement d'une table d'une BDD. Dans l'exemple, je n'ai mis que le champ qui m'intéressait et il faut savoir que ce champ là est multi-valué, chaque donnée séparée d'une autre par * est comme une valeur parmi d'autres du champ.

    Grosso modo, il faut que, algorithmiquement parlant, je trouve tout enregistrement dont le champ multi-valué contient au moins 1 de ses données commençant par "13" ou "13.160" comme dans mes exemples.

  4. #4
    Membre émérite
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Par défaut
    pas bien compris ta description sur les champs mutlivalués (un exemple concret sous la main peut-être?)
    pourquoi n'insères tu pas chaque ligne dans un tableau
    tu parcours le tableau et pour chaque cellule tu exploses ta string suivant le caractère * dans un autre tableau
    et tu grep 13 ou 13.160 sur le second tableau?

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    tu peux faire /(?:^|\*)13/ et /(?:^|\*)13\.160/

    (le "?:" n'est la que pour eviter une capture inutile)


    EDIT: en fait c'est ce que Jeday proposait deja

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 612
    Par défaut
    Grrrrrrrrrrr

    J'avais rédigé un long truc pour te répondre et au moment de valider, PAF (le chien) ! Coupure de courant !!

    Citation Envoyé par gerald2545
    pas bien compris ta description sur les champs mutlivalués (un exemple concret sous la main peut-être?)
    Pour faire simple avant la prochaine coupure de jus , disons que dans une BDD "classique", tu as une table qui gère des enregistrements, que chaque enregistrement contient des champs, lesquels champs contiennent (ou pas, sans importance ici) 1 donnée.

    Le SGBD sur lequel je travaille reprend le même principe SAUF que certains champs peuvent contenir + d'une donnée.

    Imagine que tu veux créer la table PERSONNEL pour y consigner les noms, prénoms et profession du personnel d'une boîte. Tu as besoin d'avoir tous les prénoms d'une personne.

    Ta table pourrait très bien être comme suit :

    champ1 = NOM
    champ2 = PRENOM1
    champ3 = PRENOM2
    champ4 = PRENOM3
    champ5 = PROFESSION

    Ici, ça donnerait plus ceci :

    champ1 = NOM
    champ2 = PRENOMS
    champ3 = PROFESSION

    Citation Envoyé par gerald2545
    pourquoi n'insères tu pas chaque ligne dans un tableau
    tu parcours le tableau et pour chaque cellule tu exploses ta string suivant le caractère * dans un autre tableau
    et tu grep 13 ou 13.160 sur le second tableau?
    Pour l'exemple que je voulais montrer, j'ai été à l'essentiel mais dans la réalité, il y a des milliers d'enregistrements et plusieurs dizaines de conditions recherchées.

    Une des conditions recherchées peut très bien être de rechercher dans le CHAMP27 si le champ contient une valeur commençant par "13", ou "27.120" ou "33.100" ou "97.100" et la condition suivante pourra très bien être de rechercher tout enregistrement dont le CHAMP27 contient une valeur commençant par "17" ou "33.180" MAIS NE COMMENCANT PAS PAR "95.100".

    Eclater le contenu du champ dans une liste, puis de parcourir celle-ci en fonction des critères de sélection ou de non sélection, ça fait un peu trop lourd. D'où mon idée de passer par une RegExp directement en scannant le contenu du champ dans son intégralité. D'autant plus faisable que chaque donnée est séparée des autres par un *.

  7. #7
    Membre émérite
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Par défaut
    OK merci pour les explications.
    Les différentes propositions t'ont permis de répondre à ton problème?
    bon WE

  8. #8
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    J'utiliserais sans doute cette regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m/(?: \A | \* )13/x
    --
    Jedaï

  9. #9
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 612
    Par défaut
    Et que dites-vous de celle-ci : Sachant que le début de la valeur recherchée peut se trouver en 1ère position dans le champ ou quelque part après un *, cette RegExp là devrait pouvoir remplir toutes les conditions recherchées d'aprés vous ???

    Et pour rechercher "13.160" : ???

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

Discussions similaires

  1. Générateur de clés de validation (besoin d'être testé)
    Par Demystificator dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 31/05/2010, 21h21
  2. [Débutant] Besoin d'être guidé dans l'utilisation d'XML
    Par jppaysan dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 28/04/2006, 12h19
  3. [débutant] besoin d'être éclairci.
    Par Fabouney dans le forum Applets
    Réponses: 1
    Dernier message: 04/10/2005, 06h13

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