2012-05-27 2 views
4

Я пытаюсь реализовать регулярное выражение, которое, учитывая строку, проверяет последовательность из не менее 3 одинаковых символов и заменяет ее двумя символами. Например, я хочу, чтобы включить ниже строку:Perl - замена последовательностей одинаковых символов

sstttttrrrrrrriing 

в

ssttrriing 

Я имею в виду что-то вдоль линий ...

$string =~ s/(\D{3,})/substr($1, 0, 2)/e; 

Но это не будет работать потому что:

  1. Он не проверяет, являются ли три алфавита cal-символы идентичны; он может соответствовать последовательности из трех или более различных символов.
  2. Он заменяет только первое совпадение; Мне нужно разместить все совпадения в этом регулярном выражении.

Может кто мне помочь?

ответ

12

Вы можете использовать группу захвата и обратную ссылку с помощью \1, а затем вставить ее дважды после этого.

$ perl -plwe 's/(.)\1{2,}/$1$1/g' 
sstttttrrrrrrriing 
ssttrriing 

Или вы можете использовать (сохранить) последовательность эвакуации \K, чтобы избежать необходимости повторной вставки.

s/(.)\1\K\1+//g 

Заменить подстановочные . для любого подходящего характера (типа), если это необходимо. Например, для писем:

perl -plwe 's/(\pL)\1\K\1+//g' 
+0

Спинка ссылок является только то, что я ищу! Благодаря! – Dan

+0

@ Дан Доброжелательно. – TLP

3
$ echo "sssssttttttrrrrriiiinnnnggg" | perl -pe "s/(.)\1+/\1\1/g" 
ssttrriinngg 
Смежные вопросы