返回重复的名字(包括部分匹配)

这里的Excel人有时会通过vba变成自动化的PowerShell。

我试图解决https://stackoverflow.com/q/36538022/641067 (现在closures),并不能与我的基本PowerShell的知识和谷歌单独到那里。

实质上,OP提出的问题是:

  1. 文本文件中有一个名称列表。
  2. 目标是只捕获那些至less发生一次的名字(所以丢弃唯一的名字,见第(3)点)。
  3. 至less发生一次的名字包括部分匹配,即威尔威廉可以被认为是重复的,应该保留。 而比尔不是威廉的重复。

我尝试了各种方法,包括

  • Group
  • Compare-Object 见下面的例子

但是我受到了第三部分的阻碍。 我怀疑需要一个循环来做到这一点,但很好奇是否有一个直接的Powershell方法,

期待听到专家的意见。

我试过的

 $a = Get-Content "c:\temp\in.txt" $b = $a | select -unique [regex] $a_regex = '(?i)(' + (($a |foreach {[regex]::escape($_)}) –join “|”) + ')' $c = $b -match $a_regex Compare-object –referenceobject $c -IncludeEqual $a 

下面的使用循环testing脚本将适用于您所概述的规则,看起来万无一失

 $t = ('first', 'will', 'william', 'williamlong', 'unique', 'lieve', 'lieven') $s = $t | sort-object [String[]]$r = @() $i = 0; while ($i -lt $s.Count - 1) { if ($s[$i+1].StartsWith($s[$i])) { $r += $s[$i] $r += $s[$i+1] } $i++ } $r | Sort-Object -Unique 

以下使用正则expression式的testscript可能会让你开始。

 $content = "nomatch`nevenmatch1`nevenmatch12`nunevenmatch1`nunevenmatch12`nunevenmatch123" $string = (($content.Split("`n") | Sort-Object -Unique) -join "`n") $regex = [regex] '(?im)^(\w+)(\n\1\w+)+' $matchdetails = $regex.Match($string) while ($matchdetails.Success) { $matchdetails.Value $matchdetails = $matchdetails.NextMatch() }