Sprawdź, czy ciąg zawiera podciąg


113

Jak mogę sprawdzić, czy dany ciąg zawiera określony podciąg, używając Perla?

Dokładniej, chcę sprawdzić, czy s1.domain.comwystępuje w danej zmiennej ciągu.

Odpowiedzi:


232

Aby dowiedzieć się, czy ciąg zawiera podciąg, możesz użyć indexfunkcji:

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

Zwróci pozycję pierwszego wystąpienia $substrin $strlub -1, jeśli podciąg nie zostanie znaleziony.


6
Ten sposób jest szczególnie preferowany, gdy szukasz przy użyciu zmiennej - w ten sposób nie będziesz musiał używać podwójnych znaków ucieczki (w tym ciągu zmiennej), które są specjalne dla wyrażeń regularnych (takich jak :).
evgeny9

57

Inną możliwością jest użycie wyrażeń regularnych, z czego słynie Perl:

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

Ukośniki odwrotne są potrzebne, ponieważ a .może pasować do dowolnego znaku. Możesz to obejść za pomocą operatorów \Qi \E.

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

Lub możesz zrobić tak, jak powiedział eugene y i użyć funkcji indeksu . Tylko słowo ostrzeżenia: indeks zwraca a, -1gdy nie może znaleźć dopasowania zamiast undeflub 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";
} 

Będzie źle, jeśli s1.domain.comznajduje się na początku twojego ciągu. Osobiście byłem tym palony więcej niż raz.


Przypuszczam, że index()jest szybszy niż wyrażenia regularne w prostym przypadku?
G. Cito,

1
Próba odpowiedzi na pytanie perla o usunięcie podciągi - Nie porównać szybkość, ale =~, index(), ~~i match::simplewszystko wydawało się nieco awk-ward ...: - \
G. Cito

Musisz również upewnić się, że porównywane ciągi nie uwzględniają wielkości liter. S1.DOMAIN.COM nie będzie działać dla podciągu. Ale jeśli lc ($ givendomain), a następnie porównasz to z „s1.domain.com”, to zadziała. Ponadto, podciąg niekoniecznie jest właściwym podejściem - zobacz moją notatkę powyżej dotyczącą odpowiedzi Eugene y
BlueChips 23

@David W. Jakoś nie mogę domain.comdopasować subdomain.domain.comużywając powyższego REGEX, jakieś pomysły?
avrono

14

Przykład podłańcucha bez rozróżniania wielkości liter

To jest rozszerzenie odpowiedzi Eugene'a, która konwertuje ciągi znaków na małe litery przed sprawdzeniem podłańcucha:

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

1
Należy pamiętać, że fcjest to zalecane w lcprzypadku porównań bez uwzględniania wielkości liter.
melpomene
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.