Controlla se una stringa contiene una sottostringa


113

Come posso verificare se una data stringa contiene una certa sottostringa, usando Perl?

Più specificamente, voglio vedere se s1.domain.comè presente nella variabile stringa data.

Risposte:


231

Per scoprire se una stringa contiene una sottostringa puoi usare la indexfunzione:

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

Restituirà la posizione della prima occorrenza di $substrin $stro -1 se la sottostringa non viene trovata.


6
In questo modo è particolarmente preferibile, quando si esegue la ricerca utilizzando una variabile, in questo modo non sarà necessario eseguire il doppio escape (in questa stringa variabile), che sono speciali per le espressioni regolari (come :).
evgeny9

57

Un'altra possibilità è usare espressioni regolari, che è ciò per cui Perl è famoso:

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

I backslash sono necessari perché a .può corrispondere a qualsiasi carattere. Puoi aggirare questo problema usando gli operatori \Qe \E.

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

Oppure puoi fare come ha dichiarato Eugenio e utilizzare la funzione indice . Solo un avvertimento: Index restituisce un -1quando non riesce a trovare una corrispondenza invece di un undefo 0.

Quindi, questo è un errore:

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

Questo sarà sbagliato se si s1.domain.comtrova all'inizio della stringa. Personalmente sono stato bruciato su questo più di una volta.


Suppongo che index()sia più veloce delle espressioni regolari nel caso semplice?
G. Cito

1
Un tentativo di risposta perl a una domanda sulla rimozione di stringhe - Non mi paragono velocità, ma =~, index(), ~~e match::simpletutto sembrava un po ' awk-verso ...: - \
G. Cito

Devi anche assicurarti che le stringhe che stai confrontando non facciano distinzione tra maiuscole e minuscole. S1.DOMAIN.COM non funzionerà per la sottostringa. Ma se lc ($ givendomain) e poi lo confronti con "s1.domain.com", allora funzionerà. Inoltre, la sottostringa non è necessariamente l'approccio giusto - vedi la mia nota sopra alla risposta di eugene y
BlueChips23

@David W. In qualche modo non riesco a trovare la domain.comcorrispondenza subdomain.domain.comutilizzando il REGEX sopra, qualche idea?
avrono

14

Esempio di sottostringa senza distinzione tra maiuscole e minuscole

Questa è un'estensione della risposta di Eugene, che converte le stringhe in minuscolo prima di verificare la sottostringa:

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

1
Si noti che fcè consigliato lcper confronti senza distinzione tra maiuscole e minuscole.
melpomene
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.