Ü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.

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.


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.


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";
} 

1
Beachten Sie, dass dies für Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung fcempfohlen wird lc.
Melpomene
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.