Comment puis-je la remplacer toutes les occurrences de certains personnages, avec leurs prédécesseurs?
$s = "bla..bla";
$s =~ s/([^%])\./$1/g;
Je pense qu'il devrait remplacer toutes les occurrences de .
qui n'est pas après %
avec le personnage qui est avant .
.
Mais $s
est alors: bla.bla
, mais
il devrait être blabla
. Où est le problème? Je sais que je peux utiliser des quantificateurs, mais j'ai besoin de le faire de cette façon.
Qui sortie que vous attendez?
j'attends de blabla
En fait, non, vous n'avez pas besoin de faire de cette façon). Depuis un littéral dot n'est pas un pourcentage, nous sommes tous prêts sais que tout flux de points précédé par un caractère qui n'est pas un pour cent peut nous anéanti. Si il se trouve que nous avons '%...', puis de nouveau moteur fera un plaisir de préserver le point à la suite de la pour cent, en comptant comme un non-pourcentage de caractère qui précède une chaîne de points, et supprimer le reste.
j'attends de blabla
En fait, non, vous n'avez pas besoin de faire de cette façon). Depuis un littéral dot n'est pas un pourcentage, nous sommes tous prêts sais que tout flux de points précédé par un caractère qui n'est pas un pour cent peut nous anéanti. Si il se trouve que nous avons '%...', puis de nouveau moteur fera un plaisir de préserver le point à la suite de la pour cent, en comptant comme un non-pourcentage de caractère qui précède une chaîne de points, et supprimer le reste.
OriginalL'auteur Krab | 2013-02-20
Vous devez vous connecter pour publier un commentaire.
Lorsqu'un mondial de l'expression régulière est à la recherche d'une chaîne, il ne sera pas trouver chevauchement des matchs.
Le premier match de votre chaîne sera
a.
, qui est remplacé para
. Lorsque le moteur d'expressions régulières reprend la recherche commence à la prochaine.
de sorte qu'il voit.bla
que le reste de la chaîne, et votre regex nécessite un caractère de match avant le.
il ne peut donc pas correspondre à nouveau.Au lieu de cela, utilisez une valeur négative lookbehind pour effectuer l'affirmation que le caractère précédent n'est pas
%
:Notez que si vous utilisez un positif lookbehind comme
(?<=[^%])
, vous ne remplacera pas le.
si c'est le premier caractère de la chaîne.OriginalL'auteur Andrew Clark
Le problème est que même avec le
/g
drapeau, chaque substitution commence à chercher où le précédent arrêté. Vous êtes en train de remplacera.
aveca
et puisa.
aveca
, mais le deuxième remplacement n'arrive pas parce que lea
a déjà été "avalé" par le précédent de remplacement.Une des solutions est d'utiliser un zéro-largeur lookbehind affirmation:
qui permettra d'éliminer toute
.
qui est pas le premier caractère de la chaîne, et c'est pas précédée par%
.Mais vous pourriez réellement envie ce:
qui permettra d'éliminer toute
.
qui est pas précédée par%
, même si elle est le premier caractère dans la chaîne.OriginalL'auteur ruakh
Beaucoup plus simple que de regarder à l'-derrières est à utiliser:
Cela remplace n'importe quelle chaîne de l'un ou de plusieurs points d'après un personnage autre que
%
par rien.oui, faute de frappe. Merci.
+1 pour éliminer le problème de chevauchement. Rappelez-vous,
\K
et vous n'avez pas à "porter la ($)1".s/[^%]\K\.+//g
. (Depuis 5.10!)Rappelez-vous
\K
? Non, je vais devoir apprendre ce que\K
moyens... Il n'était pas en Perl 4, était-il? 😀OriginalL'auteur Jonathan Leffler