• # Langage non régulier

    Posté par . En réponse au message [Regex] interdire un certain caractère dans une chaîne globale. É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.