使用正则表达式在整行不重复的情况下去除重复项

4
^(.*)(\r?\n\1)+$

使用正则表达式将文本内容替换为\1是消除重复行的好方法,但需要整行内容相同才能消除重复。

然而,如果我想在行的前X个字符中检测和删除重复项,该怎么办?

例如: 原始文件

12345 Dennis Yancey     University of Miami
12345 Dennis Yancey     University of Milan
12345 Dennis Yancey     University of Rome
12344 Ryan Gardner      University of Spain
12347 Smith John        University of Canada

已删除重复项。
12345 Dennis Yancey     University of Miami
12344 Ryan Gardner      University of Spain
12347 Smith John        University of Canada

1
使用哪种正则表达式引擎/语言?所有重复行都是连续的还是可以与其他行混杂在一起,例如 1 1 2 1,其中1表示重复项? - ctwheels
如果重复行与其他非重复行混杂在一起,你可以使用 ^(.{10}).*$[\s\S]*?\K^\1.*,但你需要运行它直到没有更多匹配。这只适用于某些语言,因为 \K(例如 PCRE)。 - ctwheels
1个回答

3

使用第二个来检查例如前10个字符,如何?

^((.{10}).*)(?:\r?\n\2.*)+

{n}指定了应该进行重复检查的来自行开头的字符数。

  • 整行被捕获到$1中,也用作替换
  • 第二个组用于检查以重复行开始的情况

在regex101上查看此演示


另一个想法是使用lookahead并替换为空字符串:

^(.{10}).*\r?\n(?=\1)

如果捕获的$1在下一行中出现,则此命令将丢弃当前行。

这里是在regex101上的演示


为了删除包含最多10个字符的重复行,可以使用条件语句的PCRE方法: ^( ?:(.{10})|(.{0,9}$)).*+\r?\n(?(1)(?=\1)|(?=\2$)) ,并用空字符串替换。

如果您的正则表达式支持占有量词,使用.*+将提高性能

请注意,所有这些模式(以及当前的正则表达式)仅针对连续的重复行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接