什么正则表达式可以从字符串中删除重复的项目?

Tom*_*Tom 9 regex unique-values

给定一串标识符分隔:,是否可以构造一个正则表达式来将唯一标识符提取到另一个字符串中,也用:?分隔?

如何使用正则表达式实现此目的?我试过s/(:[^:])(.*)\1/$1$2/g没有运气,因为它(.*)是贪婪的并跳过最后一场比赛$1.

示例:a:b:c:d:c:c:x:c:c:e:e:f应该给a:b:c:d:x:e:f

注意:我在perl编码,但我非常感谢使用正则表达式.

Tim*_*ker 9

在支持无限重复内部的.NET中,你可以搜索

(?<=\b\1:.*)\b(\w+):?
Run Code Online (Sandbox Code Playgroud)

并用空字符串替换所有匹配项.

Perl(至少Perl 5)只支持固定长度的lookbehinds,所以你可以尝试以下(使用lookahead,结果略有不同):

\b(\w+):(?=.*\b\1:?)
Run Code Online (Sandbox Code Playgroud)

如果用空字符串替换它,则将删除重复条目的所有先前重复; 在最后一个将保持.而不是

a:b:c:d:x:e:f
Run Code Online (Sandbox Code Playgroud)

你会得到的

a:b:d:x:c:e:f
Run Code Online (Sandbox Code Playgroud)

如果没关系,你可以使用

$subject =~ s/\b(\w+):(?=.*\b\1:?)//g;
Run Code Online (Sandbox Code Playgroud)

说明:

第一个正则表达式:

(?<=\b\1:.*):检查是否可以匹配反向引用号的内容.1,后跟一个冒号,在字符串之前的某个地方.

\b(\w+):?:匹配标识符(从单词边界到下一个:),可选地后跟冒号.

第二个正则表达式:

\b(\w+)::匹配标识符和冒号.

(?=.*\b\1:?):然后检查是否可以在字符串中的前面某处匹配相同的标识符,可选地后跟冒号.