Forum Programmation.perl [Regex] interdire un certain caractère dans une chaîne globale

Posté par  .
Étiquettes : aucune
0
3
août
2009
Bonjour,

Je suppose que mon cas est trivial, malheureusement ça fait plusieurs années que je n'ai pas pratiqué les expressions rationnelles et du coup, j'ai un peu perdu la main.

Tout le code se trouve sur http://pastebin.com/m3398f5c6

J'ai l'intention de créer une expression pour enlever la balise html qui contient un attribut dont le mot-clé est "language" et la valeur "fr", ainsi que le contenu délimité par ces balises (dans cet exemple, faire sauter la deuxième ligne, tout simplement).

Évidemment, il est possible que dans la balise html soit insérée d'autres attributs, dans n'importe quel ordre. De même, la recherche se fait en multi-lignes (/s), et d'autres langues seront peut-être ajoutées par la suite.

Donc j'avais écrit la première tentative, ce qui va manger également la première ligne, puisque la recherche se concentre sur "



J'ai donc essayé la deuxième tentative et ça ne marche pas. Et là, je sèche un peu...

Quelqu'un aurait un début de solution à m’apporter ?

  • # txt2regex

    Posté par  . Évalué à 1.

    me donne

    ^< h1.*language="fr".* >.*< /h1 >
    • [^] # Re: txt2regex

      Posté par  . Évalué à 1.

      Ça ne marche pas, et ça rajoute deux erreurs:
      - la recherche se fait en mode gourmand alors que je veux du non-gourmand;
      - je n'ai jamais dit que le contenu figurait toujours en début de ligne (d'où le ^).

      Le code que j'ai fourni n'est qu'un exemple extrait d'un fichier qui contient beaucoup d'autres lignes du même type (attribut language avec d'autres balises).

      Mais ton code m'a donné une autre idée...
  • # Trouvé !

    Posté par  . Évalué à 1.

    http://pastebin.com/m62455e18

    J'ai rajouté la solution en tant que dernière ligne.
  • # Langage non régulier

    Posté par  . Évalué à 4.

    J'ai l'intention de créer une expression pour enlever la balise html qui contient un attribut dont le mot-clé est "language" et la valeur "fr", ainsi que le contenu délimité par ces balises (dans cet exemple, faire sauter la deuxième ligne, tout simplement).

    Évidemment, il est possible que dans la balise html soit insérée d'autres attributs, dans n'importe quel ordre. De même, la recherche se fait en multi-lignes (/s), et d'autres langues seront peut-être ajoutées par la suite.


    Tu mets-là le doigt sur un célèbre cas d'école en informatique théorique : les langages récursifs ne sont pas réguliers, et donc ne peuvent pas être reconnus de manière universelle par les expressions régulières. Tu rencontreras le problème à partir du moment où des balises encadront d'autres balises de même nature − typiquement « <div> » − car tu pourras extraire soit la paire la plus profonde, soit l'imbrication toute entière, mais pas t'arrêter à la balise fermante qui correspondra à celle que tu auras trouvée.

    Cela est dû au fait qu'il te faut compter le nombre de sous-balises ouvrantes pour t'arrêter à la bonne ensuite et que, pour cela, il te faut un registre. Le moyen le plus simple d'y parvenir est l'utilisation d'une pile.

    Voir Hierarchie_de_Chomsky.

Suivre le flux des commentaires

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