後読み内での無限の繰り返しをサポートする .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
それがOKなら、あなたは使うことができます
$subject =~ s/\b(\w+):(?=.*\b\1:?)//g;
説明:
最初の正規表現:
(?<=\b\1:.*)
: 後方参照番号の内容が一致するかどうかを確認します。1 の後に、文字列の前のどこかでコロンが続きます。
\b(\w+):?
: 識別子 (単語境界から次の まで:
) に一致し、オプションでコロンが続きます。
2 番目の正規表現:
\b(\w+):
: 識別子とコロンを一致させます。
(?=.*\b\1:?)
: 次に、文字列の前方のどこかで、オプションでコロンが続く同じ識別子に一致するかどうかを確認します。