En .NET que soporta la repetición infinita de búsqueda hacia atrás en el interior, se podría buscar
(?<=\b\1:.*)\b(\w+):?
y reemplazar todas las coincidencias con la cadena vacía.
Perl (al menos Perl 5) sólo admite lookbehinds de longitud fija, por lo que puede probar lo siguiente (utilizando búsqueda hacia delante, con un resultado ligeramente diferente):
\b(\w+):(?=.*\b\1:?)
Si reemplaza que con la cadena vacía , todas anteriores se eliminarán las repeticiones de una entrada duplicada; el último se mantendrá. Así que en lugar de
a:b:c:d:x:e:f
que se obtendría
a:b:d:x:c:e:f
Si eso está bien, puede utilizar
$subject =~ s/\b(\w+):(?=.*\b\1:?)//g;
Explicación:
primera expresión regular:
(?<=\b\1:.*)
: compruebe si puede hacer coincidir los contenidos de la referencia no. 1, seguido de dos puntos, en algún lugar antes de la cadena.
\b(\w+):?
: Coincide con un identificador (de un límite de palabras al siguiente :
), seguido opcionalmente por dos puntos.
Segunda regex:
\b(\w+):
: partido de un identificador y un colon.
(?=.*\b\1:?)
: A continuación, compruebe si puede hacer coincidir el mismo identificador, opcionalmente seguido de dos puntos, en algún lugar adelante de la cadena.
podría por favor mostrar un ejemplo de lo que está buscando, no lo entiendo del todo. – Anders