2011-04-21 15 views
6

Tüm özel karakterleri% ile değiştiren düzenli bir ifadem var (LIKE ile veritabanı araması için). Bu şuna benzer: Perl düzenli ifade: İlk istenen karakter dışındaki tüm karakterlerin nasıl değiştirileceği

$string =~ s/[^ a-zA-Z0-9]/%/g; 

Ancak bir dizede ilki için HARİÇ istenen tüm özel karakterleri değiştirmek için bu ifadeyi değiştirmek için nasıl bilmiyorum. Yani benim dize o

"&Hi I%m smart%yeah right%%%%" 

(Şu anda ilk '&' da değiştirilir) olacağını

"&Hi I'm smart(yeah right...)" 

gibi bakarsan.

Herhangi biri yardımcı olabilir mi?

cevap

3

Bu, tüm değiştirir ama yüzde sembolü haline maçı hedefinin ilk örneği:

{ 
    my $count = 0; 
    $string =~ s{([^ a-zA-Z0-9])}{$count++ ? "%" : $1}ge; 
} 
3

En az bir karakter gerektiren bir look-behind assertion kullanabilirsiniz:

s/(?<=.)[^ a-zA-Z0-9]/%/g; 
+0

+1 güzel bir şey "look-arkasında". – Prix

+1

Yalnızca ilk karakterin özel bir karakter olması durumunda çalışır. Genel durumdaki ilk ama özel karakterlerin hepsini değiştirmek için işe yaramıyor. – tchrist

2
substr($string, 1) =~ s/[^ a-zA-Z0-9]/%/g; 

Güncelleme: özel karakter dizesinin ilk karakteri ise yukarıdaki çalışır. Aşağıdaki çalışmalar, yerleştirildiği olursa olsun:

my $re = qr/[^ a-zA-Z0-9]/; 
my @parts = split(/($re)/, $string, 2); 
$parts[2] =~ s/$re/%/g if @parts == 3; 
$string = join('', @parts); 
+0

Ama ilk “özel karakter” ilk karakter değilse ne olur? – tchrist

+0

@tchrist, o zaman farklı bir cevapla farklı bir soru olurdu. – ikegami

+0

@tchrist, ya da belki de değil. Birkaç kez daha tekrar okuduktan sonra, seninleyim. – ikegami