【问题标题】:Notepad++ RegEx: Delete duplicate lines that are only duplicate from the beginning of the line up to a certain character(s)Notepad ++ RegEx:删除仅从行首到某个字符重复的重复行
【发布时间】:2018-07-15 21:25:14
【问题描述】:

长话短说,我正在尝试通过创建一个不允许一个人进行多票投票的简单投票系统来帮助最终幻想 XIV 吟游诗人表演社区。 Strawpoll 很容易作弊。 ^^ 所以我已经想出了如何做到这一点,但我需要 Notepad++ 中的 RegEx 函数的帮助。

我们需要检查选民何时多次投票,并删除所有这些额外的投票(而不是删除第一次投票)。因此,在文本方面,从行首到 >> 的所有内容都是我们要检查的重复项,而行中 >> 之后的部分在搜索中被忽略。

那么这个:

VoterName1 >> Thancred
VoterName1 >> Minfilia
VoterName1 >> Thancred
VoterName2 >> Wedge
VoterName3 >> Thancred
VoterName3 >> Wedge
VoterName4 >> Biggs

看起来像这样:

VoterName1 >> Thancred
VoterName2 >> Wedge
VoterName3 >> Thancred
VoterName4 >> Biggs

我试图通过结合我在网上看到的东西并摆弄并尝试学习 RegEx 来自己寻找解决方案,但编程思维(或任何你会称之为的东西)并不是我的强项。无论如何,非常感谢您的帮助!

【问题讨论】:

  • 用户名/选民名可以有空格吗?
  • 他们应该能够拥有它们。
  • 如果是这样,我们必须微调正则表达式:改用这个 ^((.+) >>.+)(\r?\n\2 .+)+ 我会更新我的答案

标签: regex duplicates notepad++


【解决方案1】:

用记事本++测试

搜索:

  • 如果用户名可以有空格:^((.+) >>.+)(\r?\n\2 .+)+
  • 如果用户名不能有空格:^((\S++).+)(\r?\n\2 .+)+

替换为:\1

它匹配第一个投票者(第 2 组),然后在以该名称开头的行上引用它。您匹配所有这些行并通过第一个捕获组(整个第一行)替换它们

另外,在notepad++中\n确实匹配\r\n所以你通常想在搜索\n时添加一个额外的\r

【讨论】:

    【解决方案2】:

    你可以使用

    ^(.+) >> (.+)(\n\1.+)+
    

    替换为

    $1 >> $2
    

    输出:

    VoterName1 >> Thancred
    VoterName2 >> Wedge
    VoterName3 >> Thancred
    VoterName4 >> Biggs
    

    它捕获选民姓名和第一个投票的字符,然后通过反向引用匹配具有相同选民姓名的后续行,并将其全部替换为(单行)选民姓名和第一个投票的字符。

    https://regex101.com/r/8pX4z4/1

    【讨论】:

    • 这似乎对我不起作用。我得到的最大进步是,如果我检查“。匹配换行符”,它至少可以标记所有行。这意味着它至少将每一行视为 ^(.+) >> (.+)(\n\1.+)+ 的匹配项
    • 对我来说很好,我确实测试过...确保您已选中 Wrap around,将 Search Mode 设置为 Regular expression,并且未选中 . matches newline跨度>
    • 双重检查。它仍然无法正常工作。也许与新线路有关?
    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2018-03-31
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    相关资源
    最近更新 更多