Come posso verificare se una data stringa contiene una certa stringa, utilizzando Perl?Controllare se una stringa contiene una stringa
Più in particolare, voglio vedere se s1.domain.com
è presente nella variabile stringa data.
Come posso verificare se una data stringa contiene una certa stringa, utilizzando Perl?Controllare se una stringa contiene una stringa
Più in particolare, voglio vedere se s1.domain.com
è presente nella variabile stringa data.
per verificare se una stringa contiene sottostringa è possibile utilizzare la funzione di index
:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
tornerà la posizione della prima occorrenza di $substr
in $str
, oppure -1 se la stringa non viene trovata.
Un'altra possibilità è quella di utilizzare regular expressions che è ciò che Perl è famosa per:
if ($mystring =~ /s1\.domain\.com/) {
print qq("$mystring" contains "s1.domain.com"\n);
}
I backslash sono necessari perché un .
può adattarsi a qualsiasi carattere. È possibile aggirare questo utilizzando gli operatori \Q
e \E
.
my $substring = "s1.domain.com";
if ($mystring =~ /\Q$substring\E/) {
print qq("$mystring" contains "$substring"\n);
}
Oppure, si può fare come eugene y dichiarato e utilizzare la funzione index. Solo una parola di avvertimento: Index restituisce un -1
quando non riesce a trovare una corrispondenza invece di un undef
o 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à male se s1.domain.com
è all'inizio della stringa. Sono stato personalmente bruciato su questo più di una volta.
Suppongo che 'index()' sia più veloce di regex nel caso semplice? –
Un tentativo di risposta perl a una domanda su [rimozione sottostringhe] (http://stackoverflow.com/a/35593275/2019415) - Non mi paragono velocità, ma '= ~', 'index()', '' ~~ e ['match :: simple'] (https://metacpan.org/pod/match::simple) sembrava tutto un po '" awk'-ward ...: - \ –
Devi anche assicurarti che le stringhe che stai confrontando non è case sensitive. S1.DOMAIN.COM non funzionerà per la sottostringa. Ma se lc ($ givendomain), e poi lo paragoni con "s1.domain.com", allora funzionerà. Inoltre, sottostringa non è necessariamente l'approccio giusto - vedere la mia nota precedente alla risposta di Eugene y – BlueChips23
Case Insensitive Substring Esempio
Si tratta di un'estensione della risposta di Eugenio, che converte le stringhe in minuscolo prima di controllare per la stringa:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}
In questo modo è particolarmente preferibile, quando si è cercando usando una variabile - in questo modo non dovrai eseguire il double escape dei caratteri (in questa stringa variabile), che sono speciali per le espressioni regolari (come ':'). – evgeny9