2014-11-10 2 views
1

Я хочу удалить слова из строки в Perl, например, у меня есть строка: Это текстовый текст очень важный и содержательный просто просто текст.Как удалить удвоенные слова в Perl?

И я это сделать:

$linia =~ s/(.*)\1/$1/g; 

Но это работает только два слова в два раза, как изменить, чтобы сделать его для 2+ удвоилась слова.

+1

Обратите внимание, что когда вы говорите "работает только", что не совсем верно. Это не работает вообще, если вы считаете, сколько раз оно будет соответствовать, когда это не должно. Например, с повторениями внутри слов, 'pool' ->' pol'. Разбор языка всегда является сложной задачей, и если вы хотите использовать простые инструменты, подобные этому, вы должны быть очень строгими в применении. – TLP

ответ

1

Просто добавьте +, чтобы соответствовать или более раз,

$linia =~ s/(.*)\1+/$1/g; 

или если вы хотите, чтобы удалить все дубликаты,

my %seen; 
$linia =~ s|(\w+)| $seen{$1}++ ? "" : $1 |ge; 
+0

Пробовал. Работал. Но оставляет несколько пробелов между словами. – Matthias

+0

@Matthias вы хотите удалить все дубликаты или только последовательные? –

+0

только последовательный, удаляет также текст с конца. – user3541098

0

Как насчет:

my $str = q/abcabcabcabc/; 
$str =~ s/(.+?)\1+/$1/; 
print $str,"\n"; 

Если у вас есть пробелы между словами:

my $str = q/abc abc abc abc/; 
$str =~ s/(\w+\s+)\1+/$1/g; 

Выход:

abc 
+0

не работает для «my $ str = q/abc abc /;» – Matthias

+0

@ Matthias: Вы не сказали, что у вас есть пробелы между словами. – Toto

+0

@Matthias: см. Мое редактирование. – Toto

Смежные вопросы