web-dev-qa-db-fra.com

implémentation regex pour remplacer le groupe par sa version minuscule

Y a-t-il une implémentation de regex qui permet de remplacer le groupe dans regex par une version en minuscule de celui-ci?

50
berek

En Perl, vous pouvez faire:

$string =~ s/(some_regex)/lc($1)/ge;

L'option /e Entraîne l'évaluation de l'expression de remplacement comme du code Perl, dont la valeur de retour est utilisée comme valeur de remplacement finale. lc($x) renvoie la version en minuscule de $x. (Pas sûr mais je suppose que lc() gérera correctement les caractères internationaux dans les versions récentes de Perl.)

/g Signifie correspondance globale. Omettez le g si vous ne voulez qu'un seul remplacement.

35
j_random_hacker

Si votre version regex le prend en charge, vous pouvez utiliser\L, comme dans un shell POSIX:

sed -r 's/(^.*)/\L\1/'
59
Kim André Sand

Plusieurs réponses ont noté l'utilisation de \L. Pourtant, \E vaut également la peine de savoir si vous utilisez \L.

\L convertit tout au suivant \U ou \E en minuscules. ... \E désactive la conversion de casse.

(Source: https://www.regular-expressions.info/replacecase.html )

Supposons donc que vous vouliez utiliser rename pour mettre en minuscule une partie de certains noms de fichiers comme celui-ci:

artist_-_album_-_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a
artist_-_album_-_Another_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a

vous pourriez faire quelque chose comme:

rename -v 's/^(.*_-_)(.*)(_-_.*.m4a)/$1\L$2\E$3/g' *
6
sampablokuper

En Perl, il y a

$string =~ tr/[A-Z]/[a-z]/;
3
Hank Gay

La plupart des implémentations Regex vous permettent de passer une fonction de rappel lors d'un remplacement, vous pouvez donc simplement renvoyer une version en minuscule de la correspondance à partir du rappel.

2
AnthonyWJones