2012-05-03 5 views
2

Я пытаюсь удалить некоторые смайлики из строки, но я не могу понять, как совместить смайлики, состоящие из специальных символов и букв, например: D или :-D (он работает для смайликов как ":-)"). Я попыталсяPerl regex matching emoticons

$message =~ s/\:D//;

и несколько других вариантов, но ничего не похоже на работу. Где я ошибаюсь?

EDIT: Я был действительно глупым и не понимал, что перед этой командой я сделал все буквы в нижнем регистре, поэтому все смайлики были уже изменены на «: d». Спасибо за помощь.

+1

Это регулярных выражений работает для меня. Используйте модуль Data :: Dumper и проверьте свой ввод и код. Например. 'print Dumper $ message'. И включите строгие и предупреждения. – TLP

+0

Напишите модуль с тестами на него и загрузите в CPAN. Люди будут использовать его, найти ошибки, написать тесты и модуль со временем станут все более и более полезными. –

ответ

2

Вы можете написать несколько модульных тестов:

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

После этого вы можете делать все остальное с помощью метода проб и ошибок.

1

Вы могли бы попробовать что-то вроде этого для начала:

s/[:;]-?[D)]// 

Добавить символы в [] классов, как вы обнаружите новые и интересные смайлики.

+0

Что такое '{1}' хорошо? – daxim

+0

Он просто гарантирует, что есть только один из символов этого класса. Я полагаю, что это не важно, но может избежать ложных срабатываний. – alan

+0

Не '{1}' избыточно? Он требует ровно одного совпадения, которое является значением по умолчанию, когда нет модификатора количества. Я что-то упускаю? –

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

Выход:

Hello World!