Làm cách nào để kiểm tra xem chuỗi đã cho có chứa chuỗi con nhất định không, sử dụng Perl?Kiểm tra xem chuỗi có chứa chuỗi con
Cụ thể hơn, tôi muốn xem liệu s1.domain.com
có mặt trong biến chuỗi đã cho hay không.
Làm cách nào để kiểm tra xem chuỗi đã cho có chứa chuỗi con nhất định không, sử dụng Perl?Kiểm tra xem chuỗi có chứa chuỗi con
Cụ thể hơn, tôi muốn xem liệu s1.domain.com
có mặt trong biến chuỗi đã cho hay không.
Để tìm hiểu xem một chuỗi chứa substring bạn có thể sử dụng chức năng index
:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
Nó sẽ trở lại vị trí của sự xuất hiện đầu tiên của $substr
trong $str
, hoặc -1 nếu chuỗi không được tìm thấy.
Một khả năng khác là sử dụng regular expressions đó là Perl là những gì nổi tiếng với:
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ể phù hợp với bất kỳ ký tự. Bạn có thể giải quyết vấn đề này bằng cách sử dụng các toán tử \Q
và \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 chức năng index. Chỉ một lời cảnh báo: Chỉ số trả về một số -1
khi không thể tìm thấy kết quả phù hợp thay vì undef
hoặc 0
.
Như vậy, đây là một lỗi:
my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
print qq("$mystring" doesn't contains "$substring"\n";
}
này sẽ là sai lầm nếu s1.domain.com
là lúc bắt đầu của chuỗi của bạn. Cá nhân tôi đã bị đốt cháy nhiều lần.
Tôi cho rằng 'index()' nhanh hơn regexps trong trường hợp đơn giản? –
Một câu trả lời perl cố gắng cho một câu hỏi về [loại bỏ chất nền] (http://stackoverflow.com/a/35593275/2019415) - Tôi không so sánh tốc độ nhưng '= ~', 'index()', '~~' và ['match :: simple'] (https://metacpan.org/pod/match::simple) tất cả dường như có một chút 'awk'-ward ...: - \ –
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 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 lưu ý của tôi ở trên để phản ứng của eugene y – BlueChips23
case insensitive xâu Ví dụ
Đây là một phần mở rộng của câu trả lời Eugene, mà chuyển đổi chuỗi để giảm trường hợp trước khi kiểm tra cho chuỗi:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}
cách này đặc biệt preferrable, 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 nhân đôi các ký tự thoát (trong chuỗi biến này), đặc biệt cho các biểu thức chính quy (như ':'). – evgeny9