提取所有唯一线

时间:2014-07-14 10:46:09

标签: regex text-extraction

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

AAAAA
AAAAA
AAAAA
BB
BBBBB
BBBBB
CCC
CCC
CCC

我只需要以下四行:

AAAAA
BB
BBBBB
CCC

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

任何帮助?

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

4 个答案:

答案 0 :(得分:9)

两个几乎相同的选项:

匹配所有未重复的行

(?sm)(^[^\r\n]+$)(?!.*^\1$)

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

替换所有重复行

这在Notepad ++中会更好用:

搜索:(?sm)(^[^\r\n]*)[\r\n](?=.*^\1)

替换:空字符串

  • (?s)激活DOTALL模式,允许点跨行匹配
  • (?m)启用了多行模式,允许^$在每一行匹配
  • (^[^\r\n]*)获取第1组的一行,即
  • ^锚点断言我们位于字符串的开头
  • [^\r\n]*匹配任何非换行字符的字符
  • [\r\n]与换行符匹配
  • 前瞻(?!.*^\1$)断言我们可以匹配任意数量的字符.*,然后......
  • ^\1$与第1组相同的行

答案 1 :(得分:3)

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

Find: ^(.*)(\r?\n\1)+$
Replace: \1

答案 2 :(得分:0)

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

s/(^.*$)(\r?\n\1$)*/$1/gm;

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

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

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

答案 3 :(得分:0)

我不知道它是否可以在Notepad ++或EmEditor中运行,但在PHP / JavaScript / Python中可以正常使用替换。

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

这是Demo

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