Überprüfen Sie, ob eine Zeichenfolge eine Teilzeichenfolge enthält

113

Wie kann ich mit Perl überprüfen, ob eine bestimmte Zeichenfolge einen bestimmten Teilstring enthält?

Insbesondere möchte ich sehen, ob s1.domain.comdie angegebene Zeichenfolgenvariable vorhanden ist.

Belgin Fisch
quelle

Antworten:

231

Um herauszufinden, ob eine Zeichenfolge Teilzeichenfolgen enthält, können Sie die folgende indexFunktion verwenden:

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

Es wird die Position des ersten Auftretens von $substrin $stroder -1 zurückgegeben, wenn der Teilstring nicht gefunden wird.

Eugene Yarmash
quelle
6
Diese Methode ist besonders vorzuziehen, wenn Sie mit einer Variablen suchen. Auf diese Weise müssen Sie keine doppelten Escape-Zeichen (in dieser Variablenzeichenfolge) verwenden, die speziell für reguläre Ausdrücke (wie :) gelten.
evgeny9
57

Eine andere Möglichkeit ist die Verwendung regulärer Ausdrücke , wofür Perl berühmt ist:

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

Die Backslashes werden benötigt, da a .mit jedem Zeichen übereinstimmen kann. Sie können dies umgehen, indem Sie die Operatoren \Qund verwenden \E.

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

Oder Sie können wie angegeben vorgehen und die Indexfunktion verwenden. Nur ein Wort der Warnung: Index gibt a zurück, -1wenn keine Übereinstimmung anstelle von undefoder gefunden werden kann 0.

Dies ist also ein Fehler:

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

Dies ist falsch, wenn s1.domain.comes am Anfang Ihrer Zeichenfolge steht. Ich persönlich bin mehr als einmal daran verbrannt worden.

David W.
quelle
Ich nehme an, index()ist im einfachen Fall schneller als Regexps?
G. Cito
1
Eine versuchte Perl Antwort auf eine Frage über Substrings entfernen - ich Geschwindigkeit nicht zu vergleichen war aber =~, index(), ~~und match::simplealle ein wenig schien awk-ward ...: - \
G. Cito
Sie müssen auch sicherstellen, dass die Zeichenfolgen, die Sie vergleichen, nicht zwischen Groß- und Kleinschreibung unterscheiden. S1.DOMAIN.COM funktioniert nicht für Teilzeichenfolgen. Aber wenn Sie lc ($ givendomain) und dann das mit "s1.domain.com" vergleichen, dann wird das funktionieren. Außerdem ist Teilzeichenfolge nicht unbedingt der richtige Ansatz - siehe meine Anmerkung oben zu
Eugenes
@ David W. Irgendwie kann ich nicht bekommen domain.compassen subdomain.domain.comüber die REGEX verwenden, irgendwelche Ideen?
Avrono
14

Beispiel für eine Teilzeichenfolge ohne Berücksichtigung der Groß- und Kleinschreibung

Dies ist eine Erweiterung von Eugenes Antwort, die die Zeichenfolgen in Kleinbuchstaben konvertiert, bevor nach dem Teilstring gesucht wird:

if (index(lc($str), lc($substr)) != -1) {
    print "$str contains $substr\n";
} 
James Oravec
quelle
1
Beachten Sie, dass dies für Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung fcempfohlen wird lc.
Melpomene