2014-07-14 40 views
7

我有重复的文本行的文本文件,但我只想要每一个。 想象一下这样的文本文件:提取所有的独特行

AAAAA 
AAAAA 
AAAAA 
BB 
BBBBB 
BBBBB 
CCC 
CCC 
CCC 

我只需要以下四行从中:

AAAAA 
BB 
BBBBB 
CCC 

我使用文本编辑器(EmEditor中或记事本+ +),支持正则表达式,而不是一个编程语言,所以我必须使用纯正则表达式。

任何帮助?

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

+0

[在记事本中删除重复的行++](http://stackoverflow.com/questions/3958350/removing-duplicate-rows-in-notepad) – hsz

+0

重复线组合在一起的可能重复?也就是说,该文件可以是AAAA BBBB AAAA BBBB,以便您想让它成为AAAA BBBB? –

+0

Gelbukh的答案:行必须与最初的顺序完全相同。 –

回答

7

两个几乎相同的选择:

匹配的行不重复

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

直线将相匹配,但提取它们,你真的想更换其他的。

全部替换重复行

这将在记事本中更好地工作++:

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

替换:空字符串

  • (?s)激活DOTALL模式,允许点以匹配线
  • (?m)接通多行模式,允许^$以匹配每行
  • (^[^\r\n]*)捕捉到线路到组1,即
  • ^锚断言,我们是在字符串的开头
  • [^\r\n]*不在换行字符
  • [\r\n]匹配换行字符
  • 先行(?!.*^\1$)断言,我们可以匹配任何数量的C任何字符匹配然后...
  • ^\1$的同一行第1组
+0

添加了一个选项'Replace All Repeated Lines',它可以在文本编辑器中更好地工作,因为您想要“提取”这些行。 – zx81

+0

非常感谢。您的第二个正则表达式(替换所有重复行)是我所需要的。第一个是相反的(但可能是有用的,所以让它)。它可以在我需要的EmEditor和Notepad ++上同样工作,但它不会删除空行。 :(我已经尝试添加'|^\ n $'到最后,但它什么都没做。如果你能帮我解决这个问题,这将是最好的答案。:) –

+0

请看修改后的答案。如果这适用于您,请考虑接受答案,方法是单击左侧的复选标记,因为现在代表系统在网站上运行。谢谢! – zx81

0

前提是等于线组去,也就是AAAA AAAA BBBB BBBB和不AAAA BBBB AAAA BBBB,在Perl符号,以下工作:

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

这意味着替代/(^。$)(\ r?\ n \ 1 $)/for $ 1全球多线模式(^和$匹配内部\ n)。

此表达式意味着任何完整的行后跟任意数量的相等行被替换为单个事件。

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

+0

谢谢,但这不是我请求的简单文本编辑器。我已经尝试过没有最后的部分,但它仍然无法正常工作。 –

0

我不知道它可以在Notepad ++或EmEditor中工作,但可以在PHP/JavaScript/Python中使用替代工作正常工作。

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

这里是Demo

只需复制文本,并从我分享你的链接的最终结果。

+1

感谢您的链接,debuuger是有用的。然而,正则表达式需要替换任何字符而不仅仅是字母,所以它并不是我真正需要的。所以我用\替换了\ w。但现在它清除了EmEditor和Notepad ++中的所有内容,尽管它在调试器上“工作得很好”......也许它使用了不同的正则表达式标准...... –

+0

不知道为什么它不能在notepad ++ ++ – Braj

2

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

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

中工作谢谢。好的解决方案,但只适用于Notepad ++,因为它是。我删除了问号'?'使它在EmEditor上工作,但它只能删除几行。我认为这可能是EmEditor(程序本身)的错误,而不是代码的错误,所以我认为这个答案是正确的。然而,由于我不得不选择最好的一个,所以我选择了zx81中的一个,因为他的答案很详细,不需要任何替换(更实用),也可以删除原始文件中可能存在的任何空行我还需要一些东西),当然,它在两位编辑中都是如此。 –