关于正则表达式:提取所有唯一线

Extract All Unique Lines

我有重复精确文本行的文本文件,但我只想要其中一个。
想象一下这个文本文件:

1
2
3
4
5
6
7
8
9
AAAAA
AAAAA
AAAAA
BB
BBBBB
BBBBB
CCC
CCC
CCC

我只需要以下四行:

1
2
3
4
AAAAA
BB
BBBBB
CCC

我使用的是文本编辑器(EmEditor或Notepad ++),它支持RegEx,而不是编程语言,所以我必须使用纯正的表达式。

有帮助吗?

编辑:
我检查了hsz提到的另一个帖子,我想说清楚这个是不一样的。
虽然两者都需要删除重复的行,但实现它的方法是不同的。
我需要纯粹的RegEx,但是来自其他线程的最佳答案依赖于特定的Notepad ++插件(它甚至不再带有它),所以它甚至不是正则表达式解决方案。
第二种情况是正则表达式,它在Notepad ++上有效,但在EmEditor上却没有,我也需要它。
所以我不认为我的问题是重复那个问题,虽然这个链接很有用,所以我感谢hsz。


两个几乎相同的选项:

匹配所有不重复的行

1
2
3
(?sm)(^[^

]+$)(?!.*^\1$)

线条将匹配,但要提取它们,你真的想要替换其他线条。

替换所有重复的行

这将在Notepad ++中更好地工作:

搜索:(?sm)(^[^

]*)[

](?=.*^\1)

替换:空字符串

  • (?s)激活DOTALL模式,允许点跨线匹配
  • (?m)打开多行模式,允许^$匹配每行
  • (^[^

    ]*)捕获到第1组的一行,即

  • ^锚断言我们在字符串的开头
  • [^

    ]*匹配任何非换行字符的字符

  • [

    ]匹配换行符

  • 前瞻(?!.*^\1$)断言我们可以匹配任意数量的字符.*,然后......
  • ^\1$与第1组相同的行


您可以使用以下正则表达式删除重复和空行。

1
2
3
4
Find: ^(.*)(
?
\1)+$
Replace: \1


我不知道它会在Notepad ++或EmEditor中工作,但在PHP / JavaScript / Python中可以正常工作并进行替换。

1
2
^(.+)(
(\1))*$

这是Demo

只需复制您的文本,并从我与您分享的链接中获取最终结果。


如果相等的行分组,即AAAA AAAA BBBB BBBB而不是AAAA BBBB AAAA BBBB,则在Perl表示法中,以下工作:

1
2
3
s/(^.*$)(
?
\1$)*/$1/gm;

这意味着在全局和多线模式(^和$匹配内部 n)中以$ 1替换/(^。$)(\\\\)/。

该表达式意味着任何完整的行后跟任意数量的相等行被单个匹配项替换。

有关如何应用此类正则表达式的信息,请参阅特定编辑器的帮助。