gpt4 book ai didi

regex - 哪些正则表达式可以从字符串中删除重复项?

转载 作者:行者123 更新时间:2023-12-04 03:41:12 25 4
gpt4 key购买 nike

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

如何使用正则表达式实现呢?我尝试过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编码,但是对此我非常感谢使用正则表达式。

最佳答案

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

(?<=\b\1:.*)\b(\w+):?

并将所有匹配项替换为空字符串。

Perl(至少Perl 5)仅支持固定长度的lookbehinds,因此您可以尝试以下操作(使用lookahead,结果略有不同):
\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:?):然后检查是否可以匹配相同的标识符,并且可以在字符串前面的某个位置匹配冒号(可选)。

关于regex - 哪些正则表达式可以从字符串中删除重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3309805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com