Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Substituer et garder les references arrieres

5 réponses
Avatar
dcd
Bonjour,

Voici ce que je fais :

@match = ( $ligne =~ m/truc\s+(\w\d\s+)?(\w\d\s+)?bidule/ ) ;
$ligne =~ s/truc\s+(\w\d\s+)?(\w\d\s+)?bidule/truc\tbidule/ ;

c'est à dire que je supprime, si ils existent, les mots (deux au
maximum) de la forme s1, d3 etc. , compris dans ma chaine entre truc
et bidule .

Mais avant de les supprimer j'ai besoin de savoir combien il y en a,
et par la suite j'utilise donc @match en contexte scalaire.

Y a t-il un moyen de faire ça sans repeter l'expression reguliere ?

Merci de vos conseils.

5 réponses

Avatar
jl_morel
Dans l'article , a
dit...

Voici ce que je fais :

@match = ( $ligne =~ m/trucs+(wds+)?(wds+)?bidule/ ) ;
$ligne =~ s/trucs+(wds+)?(wds+)?bidule/tructbidule/ ;

c'est à dire que je supprime, si ils existent, les mots (deux au
maximum) de la forme s1, d3 etc. , compris dans ma chaine entre truc
et bidule .

Mais avant de les supprimer j'ai besoin de savoir combien il y en a,
et par la suite j'utilise donc @match en contexte scalaire.

Y a t-il un moyen de faire ça sans repeter l'expression reguliere ?



Après la regexp :

$ligne =~ s/trucs+(wds+)?(wds+)?bidule/tructbidule/ ;

vous pouvez utiliser la variable $#-
Elle contient 0, 1 ou 2 suivant le nombre de correspondances et
-1 si la ligne ne correspond pas au motif.

Voir perlvar :

http://www.bribes.org/perl/docfr/perlvar.html##LFFE2CCAB

--
J-L.M.

Avatar
Paul GABORIT
À (at) 8 Apr 2004 01:13:27 -0700,
(aarg) écrivait (wrote):
Voici ce que je fais :

@match = ( $ligne =~ m/trucs+(wds+)?(wds+)?bidule/ ) ;
$ligne =~ s/trucs+(wds+)?(wds+)?bidule/tructbidule/ ;

c'est à dire que je supprime, si ils existent, les mots (deux au
maximum) de la forme s1, d3 etc. , compris dans ma chaine entre truc
et bidule .

Mais avant de les supprimer j'ai besoin de savoir combien il y en a,
et par la suite j'utilise donc @match en contexte scalaire.



$match = ($ligne =~ s/trucs+(wds+)?(wds+)?bidule/tructbidule/);

L'opérateur s/// retourne le nombre de substitutions effectuées (ou la chaîne
vide si aucune substitution n'a été effectuée).

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
dcd
@match = ( $ligne =~ m/trucs+(wds+)?(wds+)?bidule/ ) ;
$ligne =~ s/trucs+(wds+)?(wds+)?bidule/tructbidule/ ;




C'est à dire que je ne peux pas faire :

$compte = ($ligne =~ s/trucs+(wds+)?(wds+)?bidule/tructbidule/
)

Car ça me renvoie 1 : ma chaine de recherche ne matche qu'une seule
fois, c'est normal.

Dans ma chaine de depart il n'y a que les mots que je veux supprimer
qui sont de la forme wd et donc en fait je peux faire :

$compte = ($ligne =~ s/wd//g )

Mais je prefererait, pour blinder le code, specifier l'endroit de la
chaine ou je veux que ça se produise : c'est à dire entre "truc" et
"bidule".

Peut etre en extrayant une sous chaine en la modifiant et en la
remplaçant dans la chaine originale .

Si vous avez des conseils ...

Avatar
Paul GABORIT
À (at) 9 Apr 2004 05:51:50 -0700,
(aarg) écrivait (wrote):
@match = ( $ligne =~ m/trucs+(wds+)?(wds+)?bidule/ ) ;
$ligne =~ s/trucs+(wds+)?(wds+)?bidule/tructbidule/ ;




C'est à dire que je ne peux pas faire :


Oui. Désolé, je n'avais pas bien compris la question. Un autre message de
l'enfilade vous fournit la bonne réponse.

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>


Avatar
dcd
Après la regexp :
$ligne =~ s/trucs+(wds+)?(wds+)?bidule/tructbidule/ ;
vous pouvez utiliser la variable $#-
Elle contient 0, 1 ou 2 suivant le nombre de correspondances et
-1 si la ligne ne correspond pas au motif.


Merci, c'est ce qu'il me fallait !

dav'