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

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

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

到这个结果

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

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

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

【问题讨论】:

    标签: regex replace duplicates notepad++


    【解决方案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
      猜你喜欢
      • 2016-11-18
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多