快速入门
教程
工具和语言
示例
参考
书评
示例
正则表达式示例
数字范围
浮点数
电子邮件地址
IP 地址
有效日期
数字日期转文本
信用卡号
匹配完整行
删除重复行
编程
两个相邻单词
陷阱
灾难性回溯
重复过多
拒绝服务
使所有内容都可选项
重复捕获组
混合使用 Unicode 和 8 位
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS Feed 和博客
RegexBuddy—The most comprehensive regular expression library!

从文件中删除重复行

如果你有一个文件中所有行都已排序(按字母顺序或其他方式),你可以轻松删除(连续)重复行。只需在你最喜欢的文本编辑器中打开文件,然后进行搜索并替换,搜索 ^(.*)(\r?\n\1)+$,并替换为 \1。要实现此目的,锚点需要在换行符之前和之后匹配(而不仅仅是在文件或字符串的开头和结尾),并且不能匹配换行符。

以下是其工作原理。 插入符号仅在行的开头匹配。因此,正则表达式引擎只会尝试在此处匹配正则表达式的其余部分。 星号组合只是匹配整个行,无论其内容如何(如果有)。 括号将匹配的行存储到第一个反向引用中。

接下来,我们将匹配行分隔符。我将问号放入 \r?\n,以使此正则表达式同时适用于 Windows (\r\n) 和 UNIX (\n) 文本文件。因此,到目前为止,我们匹配了一行和随后的换行符。

现在我们需要检查此组合后是否紧跟该行的副本。我们只需使用 \1即可实现此目的。这是包含我们匹配的行第一个反向引用。反向引用将匹配完全相同的文本。

如果反向引用匹配失败,则正则表达式匹配和反向引用将被丢弃,并且正则表达式引擎将在下一行的开头重试。如果反向引用成功,则正则表达式中的加号将尝试匹配该行的其他副本。最后,美元符号强制正则表达式引擎检查反向引用匹配的文本是否为完整行。我们已经知道反向引用匹配的文本之前有一个换行符(由\r?\n匹配)。因此,我们现在检查它后面是否也跟着换行符,或者它是否使用美元符号位于文件末尾。

整个匹配变为line\nline(或line\nline\nline等)。由于我们正在执行搜索和替换,因此该行、其副本以及它们之间的换行符都将从文件中删除。由于我们希望保留原始行,但不保留副本,因此我们使用\1作为替换文本以将原始行放回原处。

从字符串中删除重复项

我们可以将上述示例概括为afterseparator(item)(separator\1)+beforeseparator,其中afterseparatorbeforeseparator为零长度。因此,如果你想从逗号分隔列表中删除连续重复项,则可以使用(?<=,|^)([^,]*)(,\1)+(?=,|$)

正向后顾(?<=,|^)强制正则表达式引擎在字符串开头或逗号后开始匹配。([^,]*)捕获该项。(,\1)+匹配连续重复项。最后,正向前瞻(?=,|$)通过检查逗号或字符串结尾来检查重复项是否为完整项。