2009-01-09 16 views

cevap

30

Perl, sen yapabilirsiniz:

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

/e seçeneği, birlikte dönüş değeri son kez yeni değeri olarak kullanılır Perl kodu olarak yorumlanmalıdır yedek ifadesini değerlendirilecek neden olur. lc($x), $x'un altyazılı sürümünü döndürür. (Emin değilim ama lc()'un son Perl sürümlerinde uluslararası karakterleri doğru şekilde ele alacağını farz ediyorum.)

/g, global olarak eşleşme anlamına gelir. Tek bir değiştirme yapmak istiyorsanız g'u atlayın. senin regex versiyonu destekliyorsa

3

Perl olarak, dolayısıyla sadece callback'inde gelen maçın bir küçük versiyonunu dönebilirsiniz,

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

tabii ki uluslararası karakterler için çalışmıyor .. –

+0

[A-Z]? Bir örnek oldu. Bu, j_random_hacker'in cevabına oy verdim. –

2

En Regex uygulamaları bir yerine yaparken bir geri çağırma işlevi geçmesine izin var.

+2

s/en/some/gi? Perl olmayan çözüm için – Rhubbarb

52

, bir POSIX kabuğunda şöyle, \ L kullanabilirsiniz: Eğer Sublime Text veya TextMate gibi bir düzenleyici kullanıyorsanız

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

+1. Kate'de çalışır: "\ L \ 1" –

+3

Kabuk benzeri bir ortamda olmasanız bile, şaşırtıcı sayıda regex kitinde çalışır. – Tim

+2

@Tim: Kabul edildi, hatta Notepad ++ onu destekliyor. –

12

, iyi bir şans var Eğer $1 etrafında parantez koymak düzenli ifadeden bir şey ifade eder, değişim gibi

\L$1 

kullanabilir. Örneğin, , bazı SQL'deki alan adlarını indirgemek için kullandığım bir şey, her şeyi verilen herhangi bir satırın sonunda 'as' olarak sağladım. İlk "Bul" normal ifade:

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

ve sonra yedek ifadesi: Eğer Vim (veya muhtemelen gvim) kullanırsanız

$1 '\L$2', 

, o zaman \L\1 yerine \L$1 kullanmak isteyeceksiniz, ama farkında olmanız gereken başka bir kırışıklık daha var: Vim, literal parantez karakterleri ile kaçtı parantez karakterleri arasındaki sözdizimini tersine çevirir. Bu nedenle, değiştirmeye ("yakalanan") dahil edilecek normal ifadenin bir bölümünü atamak için, başlangıçta \( ve sonunda \) kullanırsınız. Özel bir karakterin başlangıcını (\s, \s, \w, \b vb. Gibi) işaretlemek için özel bir karakterden kaçmak yerine \'u düşünerek \ düşünün. Bu yüzden alışkın değilseniz garip görünebilir, ancak Vim yolunda düşünürseniz, bu gerçekten mantıklıdır.


ben hem TextMate ve Sublime Text bu test ettik ve olduğu gibi çalıştığını, ancak bazı editörler \1 yerine $1 kullanın. İkisini de deneyin ve editörünüzün kullandığını görün.

Bu regex'i geçmişimden yeni çektim. Ben onları kullanırken regexen her zaman tweak ve bu son sürümü söz veremem, bu yüzden ben belirtilen amaç için uygun olduğunu ve özellikle üzerinde çalıştığım SQL'den farklı olarak biçimlendirilmiş SQL ile değil, sadece düzenli ifadelerde belirli bir örnekleme. YMMV. UAYOR.

+0

Nice, Intellij IDEA bunu da destekliyor –

İlgili konular