¿Cómo puedo comprobar si una cadena dada contiene una cierta subcadena, usando Perl?Compruebe si una cadena contiene una subcadena
Más específicamente, quiero ver si s1.domain.com
está presente en la variable de cadena dada.
¿Cómo puedo comprobar si una cadena dada contiene una cierta subcadena, usando Perl?Compruebe si una cadena contiene una subcadena
Más específicamente, quiero ver si s1.domain.com
está presente en la variable de cadena dada.
Para saber si una cadena contiene subcadena puede utilizar la función index
:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
volverá la posición de la primera aparición de $substr
en $str
, o -1 si no se encuentra la subcadena.
Otra posibilidad es utilizar regular expressions que es lo que Perl es famoso por:
if ($mystring =~ /s1\.domain\.com/) {
print qq("$mystring" contains "s1.domain.com"\n);
}
Las barras invertidas son necesarios debido a que un .
puede coincidir con cualquier carácter. Puede evitar esto utilizando los operadores \Q
y \E
.
my $substring = "s1.domain.com";
if ($mystring =~ /\Q$substring\E/) {
print qq("$mystring" contains "$substring"\n);
}
O bien, puede hacer lo que declaró eugene y y utilizar la función index. Solo una palabra de advertencia: Index devuelve un -1
cuando no puede encontrar una coincidencia en lugar de undef
o 0
.
Por lo tanto, esto es un error:
my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
print qq("$mystring" doesn't contains "$substring"\n";
}
Ésta será malo si s1.domain.com
es al principio de la cadena. Personalmente me he quemado de esto más de una vez.
Supongo que 'index()' es más rápido que las expresiones regulares en el caso simple? –
Un intento de respuesta perl a una pregunta sobre [eliminar subcadenas] (http://stackoverflow.com/a/35593275/2019415) - No comparé la velocidad, pero '= ~', 'index()', '~~' y ['match :: simple'] (https://metacpan.org/pod/match::simple) todo parecía un poco' awk'-ward ...: - \ –
También debes asegurarte de que las cuerdas que estás comparando no distingue entre mayúsculas y minúsculas. S1.DOMAIN.COM no funcionará para la subcadena. Pero si usted lc ($ givendomain), y luego lo compara con "s1.domain.com", entonces eso funcionará. Además, la subcadena no es necesariamente el enfoque correcto - vea mi nota arriba para la respuesta de eugene y – BlueChips23
mayúsculas y minúsculas Subcadena Ejemplo
Ésta es una extensión de la respuesta de Eugene, que convierte las cuerdas a minúsculas antes de comprobar si la subcadena:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}
De esta manera es especialmente preferible, cuando se está buscando usando una variable - de esta manera no tendrá que escapar dos caracteres (en esta cadena variable), que son especiales para expresiones regulares (como ':'). – evgeny9