Emoticones coincidentes de expresiones regulares de Perl
Frecuentes
Visto 642 veces
2
Estoy tratando de eliminar ciertos emoticonos de una cadena, pero no puedo encontrar la forma de hacer coincidir los emoticonos que consisten en letras y caracteres especiales, por ejemplo: D o :-D (funciona para emoticones como ":-)") . Lo intenté
$message =~ s/\:D//;
y algunas otras variaciones, pero nada parece funcionar. ¿Dónde estoy equivocado?
EDITAR: en realidad fui estúpido y no me di cuenta de que hice todas las letras en minúsculas antes de este comando, por lo que todos los emoticones ya se cambiaron a ": d". Gracias por la ayuda.
3 Respuestas
3
use strict; use warnings;
my $s = "Hello ;-) :D :-D <3 World!";
my @emoticons = qw' ;-) :D :-D <3 ';
my $pat = join '|', map qr/\Q$_\E/, @emoticons;
$s =~ s/$pat//g;
$s =~ s/ +/ /g;
print "$s\n";
Salida:
Hola Mundo!
contestado el 03 de mayo de 12 a las 22:05
2
Puedes escribir algunas pruebas unitarias:
sub assert_equals($$) {
my ($expected, $actual) = @_;
$expected eq $actual or die "expected <$expected>, got <$actual>\n";
}
sub no_smilies($) {
my ($message) = @_;
$message =~ s/:D\b//g;
return $message;
}
sub test() {
assert_equals("", no_smilies(":D"));
...
}
Luego puedes hacer el resto usando prueba y error.
contestado el 03 de mayo de 12 a las 22:05
1
Podrías probar algo como esto para empezar:
s/[:;]-?[D)]//
Agregar personajes en el []
clases a medida que descubre nuevos e interesantes emoticones.
contestado el 03 de mayo de 12 a las 22:05
Solo se asegura de que solo haya uno de los personajes en esa clase. Supongo que no es imprescindible, pero puede evitar algunos falsos positivos. - alan
No es {1}
¿redundante? Requiere exactamente una coincidencia, que es la predeterminada cuando no hay un modificador de cantidad presente. ¿Me estoy perdiendo de algo? - Jason Clark
No, tienes razón. lo sacaré No es necesario. A veces mis dedos se adelantan a mi cerebro :-D - alan
Sin embargo, no evitará que coincidan más de uno; para eso, necesitaría hacer coincidir algo más inmediatamente anterior (incluido el comienzo de la línea) o usar una afirmación negativa de búsqueda posterior. - Jason Clark
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas regex perl or haz tu propia pregunta.
Esa expresión regular funciona para mí. Use el módulo Data::Dumper y verifique su entrada y código. P.ej
print Dumper $message
. Y encienda estricto y advertencias. - TLPEscriba un módulo con pruebas y cárguelo en CPAN. La gente lo usaría, encontraría errores, escribiría pruebas y el módulo se volvería cada vez más útil con el tiempo. - user649198