【问题标题】:Find duplicate words in notepad++在记事本++中查找重复的单词
【发布时间】:2020-12-15 19:07:11
【问题描述】:

我有一个包含文件层次结构及其对应 CRC32 代码的文件:

Folder A\Folder C\File three.txt         56efd95f
Folder A\File one.txt                    b8e1b873
Folder A\Folder B\Folder D\File four.txt 56efd95f
Folder A\Folder B\File two.txt           21e8e9c9

我正在使用 notepad++,我需要知道一个能够查找具有相同 CRC32 的行的正则表达式。 在这个例子中,我希望找到第 1 行和第 3 行。

我知道\s[a-zA-Z0-9]{8,8}$ 可以匹配 CRC32,但如何检查这些匹配是否重复?

此外,如果我想删除除 CRC32 之外的所有内容,为什么不使用表达式 .*(?!\s[a-zA-Z0-9]{8,8}$) 将匹配项替换为空字符串并获得一个干净的 CRC32 列表?

【问题讨论】:

  • 您也可以将文件导入 Excel/LibreOffice Calc 并按 CRC 列排序。然后滚动文件和身份副本。
  • @Robert Regex 更有趣
  • 请参阅下面的答案以查找重复的 CRC 代码。如果您仍然有兴趣删除除 CRC 代码之外的所有内容,请尝试 .*\s(?=[a-zA-Z0-9]{8,8}$) 并禁用 . matches newline 选项

标签: regex duplicates notepad++


【解决方案1】:

你可以使用类似的东西:

/([\da-f]{8}$)(?=.*\1)/gms
  • ([\da-f]{8}$) - 查找 CRC 码
  • (?=.*\1) - 确保 CRC 代码再次出现

https://regex101.com/r/fpIOCN/1

在 Notepad++ 中,只需确保启用“.matches newline”

【讨论】:

  • @Thefourthbird Notepad++ 与使用 regex101 不同。如果我单击“查找下一个”,则它会突出显示下一个。 Fwiw,Notepad++ 对于任何开始编程的人来说都是一个非常棒的工具!
  • @Thefourthbird 我不确定你的 Notepad++ 发生了什么,但我的循环一次一个匹配并突出显示它。我的 Notepad++ 也被配置为突出显示我突出显示的任何内容。请注意,在我的屏幕截图中,第一个 56efd95f 比第二个更深绿色。第一个是光标突出显示的内容,第二个是 Notepad++ 作为兄弟并向我展示了其他匹配项。
  • @Thefourthbird 设置 -> 首选项 -> 突出显示 -> “智能突出显示”启用
  • @Thefourthbird 如果您对前瞻断言感到困惑,请尝试([\da-f]{8}$).*\1
  • @Thefourthbird 我不介意 cmets。如果 OP 也同样感到困惑,那么希望他们能阅读 cmets :)
【解决方案2】:

要查找被欺骗的重复:

(?s)\h([a-zA-Z0-9]{8})$(?=.*\h\1$)

proof

删除除 CRC32 之外的所有代码:

.*\h([a-zA-Z0-9]{8})$

替换为$1。见another proof。然后,Edit -> Line Operations -> Sort Lines Lexicographically Ascending 之后 Remove Continuous Duplicate Lines

说明

--------------------------------------------------------------------------------
  \h                       horizontal whitespace
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    [a-zA-Z0-9]{8}           any character of: 'a' to 'z', 'A' to
                             'Z', '0' to '9' (8 times)
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  $                        end of a line
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    \h                       horizontal whitespace
--------------------------------------------------------------------------------
    \1                       what was matched by capture \1
--------------------------------------------------------------------------------
    $                        end of a line
--------------------------------------------------------------------------------
  )                        end of look-ahead

【讨论】:

  • 非常感谢!解决方案有效且解释非常清楚,可惜只能有一个可以接受的答案
  • @Carlos 欢迎您。您可以投票,点击向上箭头,以通知所有人答案是有帮助的。
  • 我第一次阅读你的答案时投了赞成票,但显示一条消息说,由于我的声誉低,系统不会显示它,但会考虑它。现在,人们对我的问题进行了投票,我得到了一些分数,系统会显示我的投票;)
猜你喜欢
  • 1970-01-01
  • 2013-03-06
  • 2016-07-01
  • 2021-12-11
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2012-12-11
  • 2012-12-14
相关资源
最近更新 更多