en Perl, comment écrire une expression régulière qui ne remplace que N à N matchs par chaîne? p>
I.e., Je cherche un terrain d'entente entre s / aa / bb /; code> et
s / aa / bb / g; code>. Je veux autoriser plusieurs substitutions, mais seulement jusqu'à n fois. P>
4 Réponses :
Ce que vous voulez n'est pas possible dans des expressions régulières. Mais vous pouvez mettre le remplacement dans une boucle pour boucle: résultat: p> bbbbbbbaaaaaaaaaaaaa p>
blockQuote> p>
pour mon $ i (0 .. 3) code> est le moyen de la perl de l'écrire. Un moyen plus jolie est
$ aa = ~ s / aa / bb / pour 1 .. 3 code>.
Peut-être mettre un en dernier sauf si $ aa = ~ ... code> là-bas pour une efficacité
Notez que cette approche peut échouer pour des paires d'expressions de recherche et de remplacement par exemple. $ AA = ~ S / AA / BA /; code>
Vous pouvez utiliser le drapeau / e code> qui évalue le côté droit comme expression:
Je peux penser à trois manières fiables. Le premier consiste à remplacer tout après la nième match avec elle-même.
my $max = 5; $s =~ s/aa/ba/ for 1..$max; # XXX Turns 'aaaaaaaa' # into 'bbbbbaaa' # instead of 'babababa'
+1 pour indiquer le problème avec s /.../.../ pour 1..n code>. Mais l'exemple a une faille mineure,
aaaa code> deviendrait
bbba code> pas
bbbb code>.
@Qtax, merci. Je ne voulais pas bownvote Hubert Schölnast depuis qu'il est nouveau et sa réponse fonctionne réellement pour la question spécifique posée, mais je doute que l'OP fonctionne vraiment avec aa code> et
bb code>. J'ai donc couvert pourquoi sa solution est fragile ici.
@ikegami Cela fait longtemps que je n'ai fait que Perl, mais si vous pouviez garder une trace de quelle position dans la chaîne vous êtes et redémarrez la recherche de regex à partir de là, cela résoudrait le problème avec S / ... /.../ pour 1..n code>. Bien que ce soit un peu laids.
@JB., a ajouté une telle solution, mais ce n'est pas si jolie non plus.
Voici une solution utilisant le modificateur / e, avec lequel vous pouvez utiliser code Perl pour générer la chaîne de remplacement:
p> avec perl 5.10 ou plus tard, vous pouvez laisser tomber le $ & (qui a bizarre
complications de performance) et utilisez $ {^ match} via le modificateur / p p> p> C'est dommage que vous ne pouvez pas simplement faire cela, mais vous ne peut pas:
p>