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

时间:2016-04-12 05:19:16

标签: excel powershell

这里的Excel家伙偶尔会通过vba自动化

我试图解决https://stackoverflow.com/q/36538022/641067(现已关闭)并且无法通过我的基本知识库知识和googlefu来实现目标。

本质上OP提出的问题是:

  1. 文本文件中有一个名称列表。
  2. 目标是仅捕获至少出现一次的名称(因此丢弃唯一名称,请参阅第(3)点)。
  3. 至少发生一次的名称包括部分匹配,即威廉可视为重复,并应予以保留。而 Bill 不是 William 的复制品。
  4. 我尝试了各种方法,包括

    • Group
    • Compare-Object 请参阅下面的示例

    但我被第(3)部分阻碍了。我怀疑需要一个循环才能做到这一点,但我很好奇是否有直接的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 
    

1 个答案:

答案 0 :(得分:3)

使用循环测试脚本将适用于您概述的规则,看起来万无一失

$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

使用正则表达式的testcript可能会让你开始。

$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()
}