【问题标题】:Notepad++ Regex to find string on a line and remove duplicates of the exact stringNotepad ++正则表达式在一行上查找字符串并删除确切字符串的重复项
【发布时间】:2015-05-28 22:51:51
【问题描述】:

任何人都知道如何匹配一个随机字符串,然后在文件的每一行中删除并重新出现相同的字符串。

基本上我有一个文件:

00101  blah 0000202 thisisasentencethisisasentence 99929
00102  blah 0000202 thisisasentenc1thisisasentenc1 999292

我想删除重复的句子,让它返回:

00101  blah 0000202 thisisasentence 99929
00102  blah 0000202 thisisasentenc1 999292

宽度不是固定的或类似的。

我认为这很接近,但我不太了解正则表达式,它会突出显示文件中除最后一行之外的所有内容 - 正确找到重复项但只有一次。 Removing duplicate strings/words(not lines) using RegEx(notepad++)

注意,我还可以使用以下内容来识别每行的哪些部分重复 - 它突出显示重复的值(thisisasentencethisisasentence),但我不知道如何拆分它

(.{5,})\1

任何帮助将不胜感激, 谢谢。

编辑我可以重新格式化以创建逗号分隔(在某种程度上):(请注意,重复的字符串中可能存在逗号,但不要担心)

00101,blah,0000202,thisisasentencethisisasentence,99929
00102,blah,0000202,thisisasentenc1thisisasentenc1,999292

【问题讨论】:

  • 重复的字符串总是在第四列吗?
  • 总是没有注释,但总是在逗号之后(编辑上面的内容以显示这一点)
  • 啊,我可能没有说清楚 - 它只突出显示重复的部分 - 使用 $1 只是用它自己替换那里的内容(两个句子)

标签: regex duplicates notepad++


【解决方案1】:

你可以在 notepad++ 中使用这个模式,用一个空字符串作为替换:

^(?>\S+[^\S\n]+){3,}?(\S+?)\K\1(?!\S)

demo

图案细节:

^        # anchors for the start of the line (by default in notepad++)
(?>            # atomic group: a column and the following space
    \S+          # all that is not a white-space character 
    [^\S\n]+     # white-spaces except newlines
){3,}?         # repeat 3 or more times (non-greedy) until you find
(\S+?)\K\1(?!\S)  # a column with a duplicate

最后一个子模式的细节:

(\S+?)   # capture one or more non-white characters
         # (non-greedy: until \1(?!\S) succeeds)
\K       # discard all previous characters from whole match result
\1       # back-reference to the capture group 1
(?!\S)   # ensure that the end of the column is reached

注意:如果您确定列至少包含五个字符,则在 \S+?(所以 \S{5,}?)中使用 {5,} 而不是 + 是个好主意。

【讨论】:

  • 如此接近,它适用于一堆,但可以扩展它以考虑字符串中的空格,例如“这是一个句子,这是一个句子” - 不过谢谢。我也许能够应付上述情况。
  • @n34_panda: 列是否由制表符分隔?
  • 不,不幸的是,我实际上是从网站下载数据作为字符串并尝试将其格式化为导入文件。我可以很容易地添加逗号来分隔字段,如果我这样做,那么重复项将始终位于第 4 列中(请参阅问题中的编辑)这最初没有显示在问题中......它正在进行中跨度>
  • 你可能已经做的够多了,别担心我把它和逗号或空格混淆了......它已经帮助了很多人
  • @n34_panda:这种模式的主要问题只是算法的复杂性。您可以对其进行修改以更好地满足您的要求,但请记住尽可能限制。一个机会,大小是有限的,因为副本和原件在同一行并且是连续的,并且在副本之后和原件之前总是有一个空格(或字符串的结尾)。
【解决方案2】:

您说您对 (.{5,})\1 匹配的内容感到满意。因此,只需使用$1 作为替换值。它会自动将重复的部分及其副本替换为文本的单个副本。

【讨论】:

    猜你喜欢
    • 2020-10-07
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2019-10-11
    相关资源
    最近更新 更多