Bir dizenin bir alt dize içerip içermediğini kontrol edin


113

Perl kullanarak belirli bir dizenin belirli bir alt dizge içerip içermediğini nasıl kontrol edebilirim?

Daha spesifik olarak, s1.domain.comverilen dize değişkeninde olup olmadığını görmek istiyorum .

Yanıtlar:


232

Bir dizenin alt dize içerip içermediğini öğrenmek için indexişlevi kullanabilirsiniz :

if (index($str, $substr) != -1) {
    print "$str contains $substr\n";
} 

Bu ilk bulunduğu konuma geri döner $substrolarak $strveya -1 substring bulunmazsa.


6
Bu yol, bir değişken kullanarak arama yaptığınızda özellikle tercih edilir - bu şekilde, normal ifadeler (gibi :) için özel olan karakterlerin (bu değişken dizesinde) çift çıkışına gerek kalmaz .
evgeny9

57

Diğer bir olasılık, Perl'in meşhur olduğu düzenli ifadeler kullanmaktır :

if ($mystring =~ /s1\.domain\.com/) {
   print qq("$mystring" contains "s1.domain.com"\n);
}

Ters eğik çizgi, .herhangi bir karakterle eşleşebileceği için gereklidir . \QVe \Eoperatörlerini kullanarak bu sorunu aşabilirsiniz.

my $substring = "s1.domain.com";
    if ($mystring =~ /\Q$substring\E/) {
   print qq("$mystring" contains "$substring"\n);
}

Ya da eugene y'nin belirttiği gibi yapabilir ve indeks işlevini kullanabilirsiniz . Sadece bir uyarı kelimesi: Dizin -1, undefveya yerine eşleşme bulamadığında bir döndürür 0.

Dolayısıyla bu bir hatadır:

my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
    print qq("$mystring" doesn't contains "$substring"\n";
} 

Dizinizin başındaysa bu yanlış olacaktır s1.domain.com. Şahsen bu konuda bir kereden fazla yandım.


Sanırım index()basit durumda normal ifadelerden daha hızlıdır?
G. Cito

1
Bir hakkında bir soruya perl cevabı teşebbüs alt dizeleri çıkarmadan motora güç karşılaştırmak ama vermedi - =~, index(), ~~ve match::simpletüm biraz görünüyordu awk... -ward: - \
G. CITO

Ayrıca karşılaştırdığınız dizelerin büyük / küçük harfe duyarlı olmadığından da emin olmalısınız. S1.DOMAIN.COM alt dize için çalışmaz. Ama eğer lc ($ givendomain) ve sonra bunu "s1.domain.com" ile karşılaştırırsanız, o zaman işe yarayacaktır. Ayrıca, alt dizgi mutlaka doğru bir yaklaşım olmayabilir - eugene y'nin cevabına ilişkin yukarıdaki notuma bakın
BlueChips23

@David W. Bir şekilde yukarıdaki REGEX'i kullanarak domain.comeşleştirme subdomain.domain.comyapamıyorum, herhangi bir fikir?
avrono

14

Büyük / Küçük Harfe Duyarlı Olmayan Alt Dize Örneği

Bu, alt dizeyi kontrol etmeden önce dizeleri küçük harfe dönüştüren Eugene'nin yanıtının bir uzantısıdır:

if (index(lc($str), lc($substr)) != -1) {
    print "$str contains $substr\n";
} 

1
Büyük / küçük harfe duyarlı olmayan karşılaştırmalar için fctavsiye edildiğini unutmayın lc.
melpomene
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.