Jak mogę sprawdzić, czy dany ciąg znaków zawiera pewien podciąg, używając Perla?Sprawdź, czy ciąg zawiera podłańcuch
Dokładniej, chcę sprawdzić, czy w podanej zmiennej łańcuchowej występuje s1.domain.com
.
Jak mogę sprawdzić, czy dany ciąg znaków zawiera pewien podciąg, używając Perla?Sprawdź, czy ciąg zawiera podłańcuch
Dokładniej, chcę sprawdzić, czy w podanej zmiennej łańcuchowej występuje s1.domain.com
.
Aby dowiedzieć się, czy ciąg zawiera podciąg można użyć index
funkcję:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
To zwróci pozycję pierwszego wystąpienia $substr
w $str
, lub -1 gdy podciąg nie zostanie znaleziony.
Inną możliwością jest użycie regular expressions, która jest co Perl jest znana:
if ($mystring =~ /s1\.domain\.com/) {
print qq("$mystring" contains "s1.domain.com"\n);
}
są potrzebne backslashe ponieważ .
można dopasować do dowolnego znaku. Możesz obejść to, używając operatorów \Q
i \E
.
my $substring = "s1.domain.com";
if ($mystring =~ /\Q$substring\E/) {
print qq("$mystring" contains "$substring"\n);
}
Albo można zrobić jak eugene y stwierdził i użyć funkcji index. Tylko słowo ostrzeżenia: Indeks zwraca -1
, gdy nie może znaleźć dopasowania zamiast undef
lub 0
.
Tak więc, jest to błąd:
my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
print qq("$mystring" doesn't contains "$substring"\n";
}
to będzie źle, jeśli s1.domain.com
jest na początku swojej ciąg. Osobiście spaliłem to więcej niż jeden raz.
Przypuszczam, że 'index()' jest szybszy niż regexps w prostym przypadku? –
Próba odpowiedzi perl na pytanie dotyczące [usuwania podciągów] (http://stackoverflow.com/a/35593275/2019415) - Nie porównywałem prędkości, ale '= ~', 'index()', '~~' i ['match :: simple'] (https://metacpan.org/pod/match::simple) wszystko wydawało się trochę' awk'-ward ...: - \ –
Musisz także upewnić się, że struny że porównujesz wielkość liter nie jest rozróżniana. S1.DOMAIN.COM nie będzie działał dla podłańcuchów. Ale jeśli lc ($ givendomain), a następnie porównać to z "s1.domain.com", to będzie działać. Również podłańcuch niekoniecznie jest właściwym podejściem - patrz moja uwaga powyżej do odpowiedzi eugene y – BlueChips23
Case Insensitive podciągu Przykład
Jest to rozszerzenie odpowiedzi Eugeniusza, który przekształca sznurki na małe litery przed sprawdzeniem podciągu:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}
Ten sposób jest szczególnie preferuje, gdy jesteś przeszukując za pomocą zmiennej - w ten sposób nie będziesz musiał podwójnie uciekać znaków (w tym łańcuchu zmiennych), które są specjalne dla wyrażeń regularnych (jak ':'). – evgeny9