Emoticones coincidentes de expresiones regulares de Perl

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.

preguntado el 03 de mayo de 12 a las 22:05

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. -

Escriba 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. -

3 Respuestas

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

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

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 or haz tu propia pregunta.