正则表达式删除与第二个字符串匹配的行?

Posted

技术标签:

【中文标题】正则表达式删除与第二个字符串匹配的行?【英文标题】:Regex to delete lines that match the second string? 【发布时间】:2020-05-03 12:12:32 【问题描述】:

我有一长串这样的情况,第二个单词(空格后的第二个字符串)相同的行,但其余的不同。我只需要保留一行唯一的第二个字符串。仅适用于具有相同第二个单词且始终连续的行。例如,我有几行:

lineA 12345lineB 12345lineC 12345lineD 788878lineE 110881lineF 110881lineG 110881lineH 287778lineJ 251287lineK 242424 lineL 242424lineM 242424

到这个结果

lineA 12345
线D 788878
线E 110881
线H 287778
线J 251287
线K 242424

因此,如果行中的第二个单词是匹配项,则删除除一行之外的所有单词。 我尝试创建正则表达式,但只有在第一个单词匹配时才会删除,我不知道如何像示例中那样为空格后的第二个单词执行此操作。

^(\S++).*\K(?:\R\1(?:\h.*|$))+

【问题讨论】:

【参考方案1】:

您不需要所有的点星。他们会让事情慢下来。您的正确且较短的版本是:

^\S+\K( \S++)([^ ]+\1)+

并用$1替换所有匹配项

见live demo here

【讨论】:

【参考方案2】: Ctrl+H 查找内容:^\S+\h+(\S+)\R\K(?:\S+\h+\1(?:\R|\Z))+ 替换为:LEAVE EMPTY 检查 环绕 CHECK 正则表达式 全部替换

Demo & Explanation

屏幕截图(之前):

屏幕截图(之后):

【讨论】:

测试了所有,你的似乎比其他人更正确。它不仅删除带有数字的行,而且在这种情况下工作正常:lines555 notdelete lines5aa notdeleteww13【参考方案3】:

这可以通过捕获 2 个组来完成,第一个是您要保留 (\S+ (\d+)) 的原始行,第二个嵌套组具有重复数字(在您的情况下为 (\d+))。

然后,当数字在(?:\R\S+ \2)+ 中重复\2 时,我们会找到与模式匹配的所有后续行(贪婪),并将所有这些行替换为第一行 $1

查找没有换行符的正则表达式:(\S+ (\d+))(?:\R\S+ \2)+ 全部替换为:$1

编辑:感谢 Aaron 的换行技巧!在 npp 工作 16 年后学习新知识!

【讨论】:

您可以使用\R 代替[\r\n]1,2,它以与平台无关的方式匹配换行符的所有字符。它没有在许多正则表达式风格中实现,但它在 Notepad++ 使用的 Boost 引擎中实现。 我的错,我没有说第二行不仅可以包含数字,而且只能包含字母或字母与数字混合,所以 Aaron 的版本更通用,不知道他为什么删除它。跨度> 还注意到 Aaron 的正则表达式会删除具有相似单词的行,但删除时我需要完全匹配。 @redrednua 根据您的问题,您似乎对正则表达式有相当的了解,所以我专注于您提供的用例,并假设将 \d 调整为任何捕获组,例如任何场景的另一个 \S

以上是关于正则表达式删除与第二个字符串匹配的行?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 匹配第二个逗号(或逗号和空格)之后的所有内容

使用 Python 删除所有匹配正则表达式的行

正则表达式()()12的用法

正则表达式匹配字符周围的字符,正则表达式中的AND运算符?

java正则表达式,怎么匹配空白行

批处理正则表达式怎样替换第二个指定字符