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

Shell et commandes GNU Discussion :

Backslash dans une regex


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 9
    Par défaut Backslash dans une regex
    Bonjour !
    Je suis en train de faire les exercices que vous proposez sur votre site et franchement ils sont tops ! J'étais en train de faire l'exercice sur la calculatrice. En m'inspirant des solutions proposées, j'ai voulu créer une regex mais quelque chose n'allait pas. J'arrive à un problème assez surprenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if [[ $1 =~ ^[\*\+\-\/]$ ]]
    then
    	echo "Condition vrai"
    else 
    	echo "Condition fausse"
    fi
     
    if [[ $1 =~ ^[\-\/\+\*]$ ]]
    then
    	echo "Condition vrai"
    else 
    	echo "Condition fausse"
    fi
    Quand je teste ces deux fonctions en donnant en paramètre à chaque fois un des opérateurs +, -, * et /, j'ai systématiquement "Condition fausse" pour la première partie de code et "Condition vraie" pour la deuxième partie (quand je donne en paramètre autre chose que ces opérateurs, j'ai bien "Condition fausse").
    Je ne comprends pas vraiment alors que les deux regex me semblent équivalentes. Une idée ? Merci

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    le / n'est pas un caractère spécial dans une regex; il doit pas être protégé.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 9
    Par défaut
    Merci pour ta réponse. J'ai bien enlevé le backslash avant le / mais j'ai toujours le même problème... (d'ailleurs - n'est pas un caractère spécial non plus ?).
    Encore plus étonnant, j'obtiens des différents résultats avec ces deux regex (en mettant des backslash ou pas), je n'arrive pas à comprendre pourquoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [\+\*/-]
    [\+\*-/]

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    si, dans une regex, -, entre [], indique un intervalle.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 9
    Par défaut
    Ha oui effectivement ! Donc j'ai rajouté le backslash pour le - mais toujours le même problème. Une idée ?

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rgx='^[\*\+/\-]$'; for v in \* + - / bb; do [[ $v =~ $rgx ]] && printf '%s\n' "${BASH_REMATCH[@]}" || echo "$v ne matche pas"; done
    *
    +
    -
    /
    bb ne matche pas
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 9
    Par défaut
    Tu as le même problème que moi ? Tu peux m'expliquer un peu ce que tu as fais, je n'ai pas tout compris. Désolé je débute en bash

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 9
    Par défaut
    En analysant mieux ce que tu vas écris, j'ai compris. Est- ce que tu peux essayer en mettant cette regex exactement \+\*\-/ , puis celle ci \*\-/\+ . Merci pour ton aide

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 9
    Par défaut
    En mettant exactement la même regex que dans ton exemple, ça marche aussi mais pas avec les regex que je viens de te donner.

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    c'est le - qui "pose problème"
    Citation Envoyé par man 7 regex
    To include a literal '-', make it the first or last character, or the second endpoint of a range.[...]
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 9
    Par défaut
    Mais pourtant avec le backslash il ne devrait pas être pris en compte non ?

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 9
    Par défaut
    Je mets quand même en résolu merci !

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Citation Envoyé par thomas.le Voir le message
    Mais pourtant avec le backslash il ne devrait pas être pris en compte non ?
    entre [], et devant -, le \ ne serait-il pas "interprété" littéralement comme valeur de début de l'intervalle ?...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    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
    Tu peux aussi retirer le backslash devant + et * qui n'ont pas à être échappés dans une classe de caractères.

  15. #15
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 9
    Par défaut
    Merci pour vos réponses ! En effet pas de besoin de backslash, donc lorsqu'un on veut identifier un - on doit le mettre en début ou en fin des [ ]. Je m'en souviendrai maintenant

  16. #16
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    En résumé, pour ceux qui tomberaient ultérieurement sur cette conversation, il faut mettre le '-' au début ou à la fin de l'intervalle de la regexp et aucun caractère n'a besoin d'être échappé par un backslash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ rgx='^[-*+/]$'; for v in \* + - / b; do [[ $v =~ $rgx ]] && printf '%s\n' "${BASH_REMATCH[@]}" || echo "$v ne matche pas"; done
    *
    +
    -
    /
    b ne matche pas
    $ rgx='^[*+/-]$'; for v in \* + - / b; do [[ $v =~ $rgx ]] && printf '%s\n' "${BASH_REMATCH[@]}" || echo "$v ne matche pas"; done
    *
    +
    -
    /
    b ne matche pas

  17. #17
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Comme on ne laisse pas mourir cette discussion de sa belle mort, je viens mettre mon grain de sel.

    Le tout premier caractère ne doit pas être le tiret mais le crochet (le cas échéant).
    Sinon, il est pris pour la fin de la liste.

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ toto=]
    $ echo $toto
    ]
    $ if [[ $toto =~ [-]] ]];then echo OK;fi                                                                                                                                                                                                                        
    $ if [[ $toto =~ [-\]] ]];then echo OK;fi                                                                                                                                                                                                                       
    $ if [[ $toto =~ []-] ]];then echo OK;fi                                                                                                                                                                                                                        
    OK

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

Discussions similaires

  1. Mettre une parenthèse dans une regex
    Par Michaël dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 08/11/2006, 19h50
  2. [RegEx] Tout sauf un mot dans une REGEX?
    Par Death83 dans le forum Langage
    Réponses: 4
    Dernier message: 02/08/2006, 11h12
  3. incidence du backslashe dans une chaine
    Par rogerio dans le forum C++
    Réponses: 7
    Dernier message: 01/06/2006, 09h57
  4. Insérer une variable dans une regex?
    Par Death83 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/05/2006, 11h28
  5. [RegEx] php et javascript dans une regex
    Par grochenel dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2005, 22h21

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