2009-01-09 14 views

Répondre

30

En Perl, vous pouvez faire:

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

L'option /e provoque l'expression de remplacement doit être interprété comme code Perl à évaluer, dont la valeur retournée est utilisée comme valeur de remplacement finale. lc($x) renvoie la version minuscule de $x. (Je ne suis pas sûr mais je suppose que lc() gérera les caractères internationaux correctement dans les versions récentes de Perl.)

/g signifie globalement. Omettez le g si vous ne voulez qu'un seul remplacement.

3

En Perl, il y a

$string =~ tr/[A-Z]/[a-z]/; 
+1

qui bien sûr ne fonctionne pas pour les caractères internationaux .. –

+0

Le [A-Z]? C'était un exemple. Cela dit, j'ai voté pour la réponse de j_random_hacker. –

2

La plupart des implémentations Regex vous permettent de passer une fonction de rappel lorsque vous faites un remplacement, d'où vous pouvez simplement retourner une version minuscule du match du rappel.

+2

s/le plus/certains/gi? – Rhubbarb

52

Si votre version regex supporte, vous pouvez utiliser \ L, comme si dans une coquille POSIX:

sed -r 's/(^.*)/\L\1/' 
+2

+1 pour la solution non-Perl. Fonctionne dans Kate: "\ L \ 1" –

+3

Cela semble fonctionner dans un nombre surprenant de kits regex, même si vous n'êtes pas dans un environnement de type shell. – Tim

+2

@Tim: D'accord, même Notepad ++ le supporte. –

12

Si vous utilisez un éditeur comme Sublime Text ou TextMate , il y a une bonne chance vous pouvez utiliser

\L$1 

comme remplacement, où $1 fait référence à quelque chose de l'expression régulière qui est mise entre parenthèses. Par exemple , voici quelque chose que j'ai utilisé pour réduire les noms de champs dans certains SQL, en obtenant tout à droite du 'as' à la fin d'une ligne donnée. Tout d'abord l'expression régulière "trouver":

(as|AS) ([A-Za-z_]+)\s*,$ 

et l'expression de remplacement:

$1 '\L$2', 

Si vous utilisez vim (ou probablement vim), alors vous voudrez utiliser \L\1 au lieu de \L$1, mais il y a une autre ride dont vous devez être conscient: Vim inverse la syntaxe entre les caractères parenthèses littéraux et les caractères parenthèses échappés. Donc, pour désigner une partie de l'expression régulière à inclure dans le remplacement ("capturé"), vous utiliserez \( au début et \) à la fin. Pensez à \ comme — au lieu d'échapper un caractère spécial pour en faire un littéral — marquant le début d'un caractère spécial (comme avec \s, \w, \b et ainsi de suite). Cela peut donc sembler étrange si vous n'y êtes pas habitué, mais c'est en fait parfaitement logique si vous y pensez de la manière de Vim.


Je l'ai testé ce dans les deux TextMate et il fonctionne et Sublime Text en l'état, mais certains éditeurs utilise \1 au lieu de $1. Essayez les deux et voyez ce que votre éditeur utilise.

Je viens juste de sortir cette regex de mon histoire. Je modifie toujours regexen tout en les utilisant, et je ne peux pas promettre cette version finale, donc je ne suggère pas qu'il est adapté au but décrit, et surtout pas avec SQL formaté différemment du SQL sur lequel je travaillais, juste que c'est un exemple spécifique de downcasing dans les expressions régulières. YMMV. UAYOR.

+0

Nice, Intellij IDEA le soutient aussi –