匹配部分重复的行

时间:2014-07-25 03:10:35

标签: regex duplicates notepad++

我的列表中的行有时与第一个“空格”字符相似,然后可以更改(即之后的日期)。

wsmith jul/12/12
bwillis jul/13/13
wsmith jul/14/12
tcruise jul/12/12

我可以轻松地对这些行进行排序,但我希望删除重复的日期条目。我确实找到了一个正则表达式的建议,但它只匹配完全相同的行。我需要能够在文件中标记整行的类似用户名。在上面的示例中,第1行和第3行将突出显示。

(为清晰起见而编辑)

2 个答案:

答案 0 :(得分:3)

PCRE引擎(由Notepad ++使用)中的紧凑公式,以查看是否有从一行到另一行的重复将是

(?m)^(\S+).*\R(?s).*?\K\1

这适用于N ++。

enter image description here

当您删除重复的行时,可能会标记更多行,因为最初正则表达式会跳过中间行以突出显示副本。

<强>解释

  • (?m)启用了多行模式,允许^$在每一行匹配
  • ^锚点断言我们位于字符串的开头
  • (\S+)捕获非空间字符到第1组
  • .*到达行尾
  • \R换行
  • (?s)激活DOTALL模式,允许点跨行匹配
  • .*?懒洋洋地匹配字符......
  • \K告诉引擎放弃与其返回的最终匹配项目匹配的内容
  • \1反向引用:匹配之前捕获的第1组。

答案 1 :(得分:2)

我提出这个正则表达式:

^(\S+) (?=(?s:.)*\1.*).*

它将标记第一批有重复的用户。

regex101 demo


^          # Beginning of line
(\S+)      # Match and store non-spaces
           # One space
(?=        # Positive look-ahead begin
  (?s:.)*  # Match any character including newlines
  \1.*     # Match the matched group (i.e. the username) and anything following on same line
)          # End lookahead
.*         # Match anything remaining on line (mainly for the first match)

如果notepad ++标记了所有捕获组,您可以使用它来突出显示所有重复项,包括最后一个:

^(\S+) (?=(?s:.)*(\1.*)).*

regex101 demo

但不幸的是(至少对于v6.5.2),N ++没有标记捕获组。