Forum Programmation.autre Expression régulière

Posté par  . Licence CC By‑SA.
Étiquettes :
0
22
oct.
2016

Bonjour, je suis un peu perdu dans les expressions régulières. Je voudrais remplacer tous les « A » par des « a » mais seulement dans le cas où « a » n'est pas suivi ou précédé par un ou plusieurs « a ».
Par exemple, l'expression régulière devrait trouver et remplacer

« abord » par « Abord » mais ne devrait pas toucher à

« baabor », « taaabour », mais devrait remplacer

« bbaatar » par « bbaatAr »

J'espère que c'est clair. Merci d'avance pour votre aide.

  • # Quelle syntaxe?

    Posté par  . Évalué à 4.

    Déjà, il faudrait préciser quel variante d'expression rationnelle (pas régulière!) tu utilise.
    Si c'est une version compatible perl, tu peux utiliser des «negative lookahead/lookbehind», ça donne:

    s/(?<!a)a(?!a)/A/g

    Si tu est limité aux expressions rationnelles POSIX (par exemple avec sed), c'est plus tordu car il faut tenir compte des a en début et fin de chaine, et il faut préserver les autres caractères, mais on s'en sort:

    s/(^|[^a])a([^a]|$)/\1A\2/g

    Une bonne référence sur les expressions rationnelles, qui en plus indique ce qu est supporté par différentes implémentations: http://www.regular-expressions.info/

    • [^] # Re: Quelle syntaxe?

      Posté par  . Évalué à 2.

      Merci pour cette réponse détaillée. Ce que je cherche sont en effet des expressions rationnelles et j'utilise la norme POSIX. Bref, je débute vraiment. Merci de ton aide. J'irai faire un tour sur ton site.

      • [^] # Re: Quelle syntaxe?

        Posté par  . Évalué à 2.

        Note que tu entendras souvent parler d’expressions régulières (ou regular expression, ou regexp, ou encore regex), même si c’est effectivement un abus de langage…

  • # Nouvelle demande

    Posté par  . Évalué à 2.

    J'ai essayé de trouver ce que je veux faire mais je suis de nouveau bloquer.
    Je voudrais cette fois-ci remplacer « a » par « A » (peu importe qu'ils soient suivis d'un « a » avant ou après) dans un motif tel que celui-ci

    « (balise)aattao(/balise) » donnerait « (balise)AAttAo(/balise) »

    ou bien « (balise)aattao(/balise) du texte et un autre (balise)efdaa(/balise) » donnerait

    « (balise)AAttAo(/balise) du texte et un autre (balise)efdAA(/balise) »

    Ce que j'ai réussi à faire pour le moment va remplacer le « a » de « autre » et du deuxième « (balise) ». Il faudrait donc que j'arrive à dire à l'expression que je veux les « a » qui sont entre « (balise) » et la première occurrence « (/balise) » qui suit directement.

    Merci d'avance.

    • [^] # Re: Nouvelle demande

      Posté par  . Évalué à 3.

      s'inspirer du premier exercice qu'on t'a donné à faire.

      la solution se trouve dans les parentheses.

      s/(balise)MOTIFdeRECHERCHE(/balise)/\1MOTIFdeRemplacement\2/g

      les parentheses vont creer les objets 1 et 2 qui seront reutilisé dans le remplacement, autour du motif.
      evidemment le motif de recherche/remplacement peut lui aussi avoir des parentheses et generer les objets.

      on numerote alors dans l'ordre de la creation des objets de recherche.

      • [^] # Re: Nouvelle demande

        Posté par  . Évalué à 2.

        Voici mon expression rationnelle pour le moment

        s/((balise).)a(.(+?\balise))/\1A\2/g

        Mais ça ne s'arrête pas à la première occurrence. Je pensais que le « +? » après la première parenthèse « ( » qui suit l'expression ferait le boulot mais ce n'est visiblement pas le cas.

        • [^] # Re: Nouvelle demande

          Posté par  . Évalué à 3.

          Ok,

          s/((balise)[^ )])a([^ )](\balise))/\1A\2/g

          semble fonctionner.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.