В .NET, который поддерживает бесконечное повторение внутри вид сзади, вы можете искать
(?<=\b\1:.*)\b(\w+):?
и замените все совпадения пустой строкой.
Perl (по крайней мере, Perl 5) поддерживает только видоискатели фиксированной длины, поэтому вы можете попробовать следующее (используя просмотр, с немного отличным результатом):
\b(\w+):(?=.*\b\1:?)
Если вы замените это пустой строкой, все предыдущие повторения повторяющейся записи будут удалены; последний один останется. Так что вместо
a:b:c:d:x:e:f
вы бы получили
a:b:d:x:c:e:f
Если все в порядке, вы можете использовать
$subject =~ s/\b(\w+):(?=.*\b\1:?)//g;
Пояснение:
Первое регулярное выражение:
(?<=\b\1:.*)
: Проверьте, можете ли вы соответствовать содержанию обратной ссылки №. 1, за которым следует двоеточие, где-то в строке.
\b(\w+):?
: сопоставить идентификатор (от границы слова до следующего :
), за которым необязательно следует двоеточие.
Второе регулярное выражение:
\b(\w+):
: сопоставить идентификатор и двоеточие.
(?=.*\b\1:?)
: Затем проверьте, можете ли вы сопоставить один и тот же идентификатор, за которым может следовать двоеточие, где-то впереди строки.