Kiểm tra xem một chuỗi có chứa một chuỗi con hay không


113

Làm cách nào để kiểm tra xem một chuỗi đã cho có chứa một chuỗi con nhất định hay không, bằng cách sử dụng Perl?

Cụ thể hơn, tôi muốn xem liệu s1.domain.comcó xuất hiện trong biến chuỗi đã cho hay không.

Câu trả lời:


231

Để tìm hiểu xem một chuỗi có chứa chuỗi con hay không, bạn có thể sử dụng indexhàm:

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

Nó sẽ trả về vị trí của lần xuất hiện đầu tiên của $substrin $strhoặc -1 nếu không tìm thấy chuỗi con.


6
Cách này đặc biệt thích hợp hơn, khi bạn đang tìm kiếm bằng cách sử dụng một biến - theo cách này, bạn sẽ không phải thoát kép các ký tự (trong chuỗi biến này), đặc biệt đối với các biểu thức chính quy (như :).
evgeny9

57

Một khả năng khác là sử dụng các biểu thức chính quy mà Perl nổi tiếng:

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

Dấu gạch chéo ngược là cần thiết vì một .có thể khớp với bất kỳ ký tự nào. Bạn có thể giải quyết vấn đề này bằng cách sử dụng toán tử \Q\E.

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

Hoặc, bạn có thể làm như eugene y đã nêu và sử dụng hàm chỉ mục . Chỉ là một lời cảnh báo: Chỉ mục trả về a -1khi nó không thể tìm thấy kết quả phù hợp thay vì undefhoặc 0.

Do đó, đây là một lỗi:

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

Điều này sẽ sai nếu s1.domain.comnằm ở đầu chuỗi của bạn. Cá nhân tôi đã bị đốt cháy về điều này hơn một lần.


Tôi cho index()là nhanh hơn regexps trong trường hợp đơn giản?
G. Cito

1
Một cố gắng trả lời perl cho một câu hỏi về loại bỏ chuỗi con - Tôi không so sánh tốc độ nhưng =~, index(), ~~match::simpletất cả dường như một chút awk-ward ...: - \
G. Cito

Bạn cũng phải đảm bảo rằng các chuỗi mà bạn đang so sánh không phân biệt chữ hoa chữ thường. S1.DOMAIN.COM sẽ không hoạt động đối với chuỗi con. Nhưng nếu bạn lc ($ givendomain), và sau đó so sánh nó với "s1.domain.com", thì điều đó sẽ hoạt động. Ngoài ra, chuỗi con không nhất thiết phải là cách tiếp cận đúng - xem chú thích của tôi ở trên để đáp ứng eugene y của
BlueChips23

@David W. Bằng cách nào đó tôi không thể domain.comkhớp subdomain.domain.combằng REGEX ở trên, có ý kiến ​​gì không?
avrono

14

Ví dụ về chuỗi con không phân biệt chữ hoa chữ thường

Đây là phần mở rộng của câu trả lời của Eugene, chuyển đổi các chuỗi thành chữ thường trước khi kiểm tra chuỗi con:

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

1
Lưu ý rằng fcđược khuyến khích hơn lcđể so sánh không phân biệt chữ hoa chữ thường.
melpomene
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.