返回重复的名字(包括部分匹配)
这里的Excel人有时会通过vba变成自动化的PowerShell。
我试图解决https://stackoverflow.com/q/36538022/641067 (现在closures),并不能与我的基本PowerShell的知识和谷歌单独到那里。
实质上,OP提出的问题是:
- 文本文件中有一个名称列表。
- 目标是只捕获那些至less发生一次的名字(所以丢弃唯一的名字,见第(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() }