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 :

aide pour une regexp


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2021
    Messages : 27
    Par défaut aide pour une regexp
    Bonjour,

    Je cherche à comparer 2 variables contenant une chaine de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $v1 ="je mange une bonne pomme";
    my $v2 = "je mange une bonne fraise";
    (my $c = "$v1\n$v2" ) =~ /^(.*)(\b.*)\n\1(.*)/;
    print "texte commun\n".$1."\n";
    print "texte diférant1\n".$2."\n";
    print "texte diférant2\n".$3."\n";
    Dans cet exemple tout fonctionne bien, ça retourne bien que "pomme" est différent de "fraise" et que le texte commun est "je mange une bonne".

    Mais voila ce que je voudrais obtenir également.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $v1 ="je mange une bonne pomme";
    my $v2 = "mange une bonne fraise";
    (my $c = "$v1\n$v2" ) =~ /^(.*)(\b.*)\n\1(.*)/;
    print "texte commun\n".$1."\n";
    print "texte diférant1\n".$2."\n";
    print "texte diférant2\n".$3."\n";
    Mais là ça fonctionne pas comme je le voudrais.

    Je voudrais qu'il me retourne le texte commun "mange une bonne" et qu'il retourne seulement le texte différent se trouvant après le texte commun.
    donc
    pomme
    fraise

    S'il y a un génie des regexp qui pourrait m'aider, ça serait super sympa!

    merci à vous.

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Le problème c'est que ton premier groupe de capture est ancré au début de la chaîne ^(.*) donc tu ne peux pas espérer qu'il capture quoi que ce soit qui ne commence pas au début de la chaîne. D'autre part, le quantificateur * l'autorise à être vide, ce qui peut aussi être un problème suivant ce que tu souhaites faire.

    Pour ton exemple de chaîne tu peux déjà changer ta pattern comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /^.*?\b(\w.*)(\b.*)\n\1(.*)/
    ou en supprimant carrément l'ancrage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /\b(\w.*)(\b.*)\n\1(.*)/
    Aprés, pour allez plus avant, il faudrait que tu détailles mieux:
    • Les mots peuvent-ils être coupés par les groupes de capture et la référence au groupe 1?
    • si les deux lignes ont plusieurs parties en commun lesquelles choisir et selon quel critère? La plus à gauche, la plus longue, autre et sur quelle ligne ?
    • La partie commune peut-elle être vide?
    • La partie commune doit-elle forcément débuter au début de la deuxième ligne?


    NB: Je n'ai pas voulu compliquer la pattern outre mesure pour améliorer sa performance, mais dans son état actuel, ce n'est pas le genre de pattern à appliquer sur une longue chaîne.

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2021
    Messages : 27
    Par défaut
    Bonjour,

    Merci de la réponse.

    J'ai pas encore trouvé la solution à ce que je recherche à faire.

    Voici mon exemple concret.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $v1 = "un garde de la porte";
    my $v2 = "de la p p";
    On peut remarquer que le text commun est :
    "de la p"
    Je voudrai donc pouvoir récupérer le text commun,
    ainsi que le text différent après le text commun.

    soit:

    text commun :
    "de la p"
    text dif:
    " p"
    merci encore de votre aide

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Donc les mots peuvent être coupés. Restent les trois autres questions que je t'ai posées, merci d'y répondre car sinon je ne peux rien faire pour toi.

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2021
    Messages : 27
    Par défaut
    Bonjour,

    alors pour les 3 questions restantes.

    Si les 2 lignes on plusieurs parties en commun.
    On prend juste la première partie,
    et on renvoie tout le texte se trouvant à droite de cette première partie commune.

    Pour la deuxième questions je ne suis pas sur de comprendre,
    mais il peux avoir effectivement aucune partie commune, dans ce cas la elle sera vide.

    Troisième question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $v1 = "un garde de la porte";
    my $v2 = "de la p p";
    Effectivement la partie commune commencera forcément toujours par:
    "de la p p" dans cette exemple.

    Les variables $v1 et $v2 sont dans une boucle, et le text change à chaque fois.

    Mais je dois toujours chercher si la chaine de $v2 se trouve quelque part dans $v1,
    puis renvoyer le texte à droite du premier texte commun trouvé.

    merci de votre aide

  6. #6
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2021
    Messages : 27
    Par défaut
    J'ai oublié pour la troisième question,


    Mais je dois toujours chercher si la chaine de $v2 se trouve quelque part dans $v1,
    puis renvoyer le texte à droite de $v2 du premier texte commun trouvé.
    Dans mon exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $v1 = "un garde de la porte";
    my $v2 = "de la p p";

    Le texte commun :
    "de la p"
    le texte différent à droite du texte commun de $v2 :
    " p"

Discussions similaires

  1. Demande d'aide pour une requête
    Par arkzor dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/12/2004, 02h40
  2. Création requete besoin d'aide pour une date
    Par royrremi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/07/2004, 22h03
  3. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  4. Aide pour une requete ... "COUNT(*)"
    Par mechantebestiole dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/05/2004, 16h27
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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