Verifique se uma string contém uma substring

113

Como posso verificar se uma determinada string contém uma determinada substring, usando Perl?

Mais especificamente, quero ver se s1.domain.comestá presente na variável string fornecida.

Peixe Belgin
fonte

Respostas:

231

Para descobrir se uma string contém substring, você pode usar a indexfunção:

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

Ele retornará a posição da primeira ocorrência de $substrin $str, ou -1 se a substring não for encontrada.

Eugene Yarmash
fonte
6
Esta forma é especialmente preferível, quando você está pesquisando usando uma variável - desta forma, você não terá que fazer um escape duplo (nesta string de variável), que são especiais para expressões regulares (como :).
evgeny9 de
57

Outra possibilidade é usar expressões regulares, pelas quais o Perl é famoso:

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

As barras invertidas são necessárias porque um .pode corresponder a qualquer caractere. Você pode contornar isso usando os operadores \Qe \E.

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

Ou, você pode fazer como Eugene y declarado e usar o índice de função. Apenas um aviso: o índice retorna um -1quando não consegue encontrar uma correspondência em vez de undefou 0.

Portanto, este é um erro:

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

Isso estará errado se s1.domain.comestiver no início de sua string. Eu pessoalmente fui queimado nisso mais de uma vez.

David W.
fonte
Suponho que index()seja mais rápido do que regexps no caso simples?
G. Cito
1
Uma tentativa de resposta perl para uma pergunta sobre a remoção de substrings - eu não comparei a velocidade =~, mas index(), ~~e match::simpletudo parecia um pouco awkestranho ...: - \
G. Cito
Você também deve ter certeza de que as strings que está comparando não diferenciam maiúsculas de minúsculas. S1.DOMAIN.COM não funcionará para substring. Mas se você lc ($ givendomain) e depois comparar com "s1.domain.com", então funcionará. Além disso, substring não é necessariamente a abordagem certa - veja minha observação acima para a resposta de
Eugênia
@ David W. De alguma forma eu não posso chegar domain.compara corresponder subdomain.domain.comusando o REGEX acima, todas as idéias?
Avrono
14

Exemplo de substring que não diferencia maiúsculas de minúsculas

Esta é uma extensão da resposta de Eugene, que converte as strings em minúsculas antes de verificar a substring:

if (index(lc($str), lc($substr)) != -1) {
    print "$str contains $substr\n";
} 
James Oravec
fonte
1
Observe que fcé recomendado lcpara comparações que não diferenciam maiúsculas de minúsculas.
melpomene