Mon but est de remplacer toutes les occurrences d'une balise arrière + à l'intérieur d'une balise. Permet de prendre la ligne à remplacer ressemble à ceci:Perl: Substitution globale dans une chaîne délimitée par des balises
<h> aa- aa- </h> <h> ba- ba- </h>
et devrait ressembler à la suite comme
<h> aa+ aa+ </h> <h> ba+ ba+ </h>
D'abord, j'ai essayé cette expression:
s/<h>(.*?)-(.*?)<\/h>/<h>$1+$2<\/h>/g;
qui a produit cette sortie:
<h> aa+ aa- </h> <h> ba+ ba- </h>
Le g op tion conduit à plus d'une substitution par ligne, mais seulement pour la première instance par parenthèse (et seulement si les deux parenthèses contiennent le point d'interrogation).
Pour affiner le problème, j'ai ensuite essayé d'obtenir une substitution sans tenir compte des étiquettes. L'expression
s/(.*?)-(.*?)/$1+$2/g;
conduit en effet au résultat souhaité
<h> aa+ aa+ </h> <h> ba+ ba+ </h>
Cela remplacera en dehors des supports d'étiquettes ainsi, bien sûr.
Alors, quel est le problème avec ma première expression, et comment puis-je atteindre mon objectif de substitution complète entre les parenthèses?
S'il existe des limites sur le jeu de caractères, tout ce qui précède le '-' vous pourriez exploiter cela. – adamse
Vous devez utiliser un analyseur à part entière, ce que les expressions régulières ne sont pas. – Ether