Periksa apakah suatu string berisi substring

113

Bagaimana cara memeriksa apakah suatu string mengandung substring tertentu, menggunakan Perl?

Lebih khusus lagi, saya ingin melihat apakah s1.domain.comada dalam variabel string yang diberikan.

Ikan Belgin
sumber

Jawaban:

231

Untuk mengetahui apakah sebuah string mengandung substring Anda dapat menggunakan indexfungsi:

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

Ini akan mengembalikan posisi kemunculan pertama $substrdalam $str, atau -1 jika substring tidak ditemukan.

Eugene Yarmash
sumber
6
Cara ini lebih disukai, saat Anda menelusuri menggunakan variabel - dengan cara ini Anda tidak perlu meloloskan diri dua kali dari karakter (dalam string variabel ini), yang khusus untuk ekspresi reguler (seperti :).
evgeny9
57

Kemungkinan lain adalah menggunakan ekspresi reguler yang merupakan hal terkenal dari Perl:

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

Garis miring terbalik diperlukan karena .dapat mencocokkan karakter apa pun. Anda dapat menyiasatinya dengan menggunakan operator \Qdan \E.

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

Atau, Anda bisa lakukan sebagai eugene y dinyatakan dan menggunakan indeks fungsi. Hanya kata peringatan: Indeks mengembalikan -1ketika tidak dapat menemukan kecocokan alih-alih undefatau 0.

Jadi, ini adalah kesalahan:

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

Ini akan salah jika s1.domain.comdi awal string Anda. Saya pribadi telah dibakar dalam hal ini lebih dari sekali.

David W.
sumber
Saya kira index()lebih cepat dari regexps dalam kasus sederhana?
G. Cito
1
Sebuah berusaha jawaban perl untuk pertanyaan tentang menghapus substring - Saya tidak membandingkan kecepatan tapi =~, index(), ~~dan match::simplesemua tampak sedikit awk-ward ...: - \
G. Cito
Anda juga harus memastikan bahwa string yang Anda bandingkan tidak case sensitive. S1.DOMAIN.COM tidak akan berfungsi untuk substring. Tetapi jika Anda lc ($ givendomain), dan kemudian membandingkannya dengan "s1.domain.com", maka itu akan berhasil. Juga, substring belum tentu merupakan pendekatan yang tepat - lihat catatan saya di atas untuk tanggapan eugene y
BlueChips23
@ David W. Entah bagaimana saya tidak bisa domain.commencocokkan subdomain.domain.commenggunakan REGEX di atas, ada ide?
avrono
14

Contoh Substring Tidak Peka Huruf Besar / Kecil

Ini adalah perpanjangan dari jawaban Eugene, yang mengubah string menjadi huruf kecil sebelum memeriksa substring:

if (index(lc($str), lc($substr)) != -1) {
    print "$str contains $substr\n";
} 
James Oravec
sumber
1
Perhatikan bahwa fcdirekomendasikan lcuntuk perbandingan tidak peka huruf besar / kecil.
melpomene