【问题标题】:Extract All Unique Lines提取所有唯一行
【发布时间】:2014-09-04 06:24:27
【问题描述】:

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

AAAAA
AAAAA
AAAAA
BB
BBBBB
BBBBB
CCC
CCC
CCC

我只需要其中的以下四行:

AAAAA
BB
BBBBB
CCC

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

有什么帮助吗?

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

【问题讨论】:

标签: regex text-extraction


【解决方案1】:

两个几乎相同的选项:

匹配所有不重复的行

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

这些行将被匹配,但要提取它们,你真的想替换其他的。

替换所有重复的行

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

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

替换:空字符串

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

【讨论】:

  • 添加了一个选项Replace All Repeated Lines,它在文本编辑器中会更好地工作,因为您想“提取”这些行。
  • 非常感谢。您的第二个 RegEx(替换所有重复行)是我需要的。第一个则相反(但可能有用,就这样吧)。它可以根据我的需要在 EmEditor 和 Notepad++ 上同样工作,但是它不会删除空行。 :( 我已经尝试在末尾添加 '|^\n$' ,但它什么也没做。如果你能帮我解决这个问题,这将是最好的答案。:)
  • 请查看修改后的答案。如果这对您有用,请考虑通过单击左侧的复选标记来接受答案,因为现在代表系统在该站点上工作。谢谢!
  • 完美!在两个编辑器中都运行良好,正是我所需要的。我投票选出最佳答案(希望系统接受它。上次没有,因为我是新来的)。最后一个简单的请求:请切换答案的顺序,因为第二个是线程的全部内容。我担心有些人可能不会因此而投票给你。 ;-)
  • 谢谢,很高兴它有帮助。 :)
【解决方案2】:

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

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

【讨论】:

  • 谢谢。很好的解决方案,但仅适用于 Notepad++,因为它是。我删除了问号“?”让它在 EmEditor 上工作,但它仍然只删除了几行。我认为这可能是 EmEditor(程序本身)的错误,而不是您的代码的错误,所以我认为这个答案是正确的。但是由于我只能选择一个最好的,所以我选择了zx81中的一个,因为他的答案很详细,不需要任何替换(更实用)并且还删除了可能在原始文件中的任何空行(我也需要的东西),当然,它在两个编辑器中都可以正常工作。
  • 在 VS Code 中使用替换:$1,然后“全部替换”。
【解决方案3】:

假设相等的行成组,即AAAA AAAA BBBB BBBB 而不是AAAA BBBB AAAA BBBB,在 Perl 表示法中,以下工作:

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

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

这个表达式意味着任何完整的行后面跟任意数量的相等的行都被替换为一次出现。

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

【讨论】:

  • 谢谢,但这不是我要求的简单文本编辑器。我试过没有最后的部分,但它仍然不起作用。
【解决方案4】:

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

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

这里是Demo

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

【讨论】:

  • 感谢您的链接,调试器很有用。但是,正则表达式需要替换任何字符而不仅仅是字母,所以我实际上不需要。所以我将 \w 替换为 .但现在它可以清除 EmEditor 和 Notepad++ 中的所有内容,尽管它在调试器上“工作”很好......也许它使用了不同的正则表达式标准......
猜你喜欢
  • 2020-09-29
  • 1970-01-01
  • 2023-02-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2017-07-21
相关资源
最近更新 更多