8
votes

Remplacez seulement jusqu'à N matchs sur une ligne

en Perl, comment écrire une expression régulière qui ne remplace que N à N matchs par chaîne?

I.e., Je cherche un terrain d'entente entre s / aa / bb /; et s / aa / bb / g; . Je veux autoriser plusieurs substitutions, mais seulement jusqu'à n fois.


0 commentaires

4 Réponses :


2
votes

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: xxx

résultat:

bbbbbbbaaaaaaaaaaaaa


3 commentaires

pour mon $ i (0 .. 3) est le moyen de la perl de l'écrire. Un moyen plus jolie est $ aa = ~ s / aa / bb / pour 1 .. 3 .


Peut-être mettre un en dernier sauf si $ aa = ~ ... 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 /;



2
votes

Vous pouvez utiliser le drapeau / e qui évalue le côté droit comme expression: xxx


0 commentaires

5
votes

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'


4 commentaires

+1 pour indiquer le problème avec s /.../.../ pour 1..n . Mais l'exemple a une faille mineure, aaaa deviendrait bbba pas bbbb .


@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 et bb . 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 . Bien que ce soit un peu laids.


@JB., a ajouté une telle solution, mais ce n'est pas si jolie non plus.



1
votes

Voici une solution utilisant le modificateur / e, avec lequel vous pouvez utiliser code Perl pour générer la chaîne de remplacement:

xxx

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

xxx

C'est dommage que vous ne pouvez pas simplement faire cela, mais vous ne peut pas: xxx


0 commentaires