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.

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.


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.


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

1
Observe que fcé recomendado lcpara comparações que não diferenciam maiúsculas de minúsculas.
melpomene
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.