powershell 比较两个数组并排除它们共有的元素

gdx19jrr  于 11个月前  发布在  Shell
关注(0)|答案(2)|浏览(185)

我的第一个数组包含一行字符串($unprotected,其中包含像"this list contains 456454“这样的行),它需要与另一个数组($blocklist,例如@('456454', '456789'))进行比较。
以下是我的尝试:

foreach ($ele in $blocklist) {
  foreach ($elem in $unprotected) { 
    if ($ele -contains $elem) { } 
    else { $var_chk = '1' }
  }
  if ($var_chk = '1') { $Arr_lst += $elem }
}

字符串

deyfvvtc

deyfvvtc1#

您的 * 直接 * 问题是PowerShell的-contains运算符是一个 * 集合运算符 *,它测试LHS对象是否 * 完全等于 * RHS集合的至少一个元素。它不要与用于 * 子字符串匹配 * 的.Contains() .NET * 方法 * 混淆。

  • 虽然PowerShell没有用于 literal 子字符串匹配的等效运算符,但您可以将-like与 * 正则表达式 * 一起使用,或将-match与 * 正则表达式 * 一起使用,默认情况下,这两种运算符都不区分大小写 *。有关详细信息,请参阅this answer

在您的情况下,我建议使用基于regex的简化方法,使用-notmatch-match运算符的否定形式:

  • 用alternation(|)公式化一个正则表达式,它在一个更大的输入字符串中查找$blockList数组的任何元素,作为一个完整的单词。
  • 然后使用内部.Where()方法遍历$unprotected数组的元素,并通过-notmatch仅返回那些与正则表达式不匹配的元素。
# With @('456454', '456789') contained in $blockList, this yields:
#    '\b(?:456454|456789)\b'
$regex = '\b(?:{0})\b' -f ($blockList -join '|')

$resultArray = $unprotected.Where({ $_ -notmatch $regex })

字符串

ecr0jaav

ecr0jaav2#

更新2:将数组声明中的;替换为,老实说,我不知道使用;的shell是什么
最新消息:
使用[System.Collections.ArrayList]代替常规数组

$unprotected=[System.Collections.ArrayList]@(88128,6465,1,415,2,30,8)
  $blocklist=[System.Collections.ArrayList]@(1,2,8)
  $blocklist.ForEach( { $unprotected.Remove($_) } )

字符串
原件:
也许是Compare-Object?它为不在两个数组中的每个值返回一个[PSCustomObject]数组,如果它存在于左数组或右数组中,则该值和箭头显式显示
范例:

PS > $Comparison = Compare-Object @(1;2;3;4) @(1;2;4;5)

PS > $Comparison | Format-List

     InputObject   : 5
     SideIndicator : =>
     
     InputObject   : 3
     SideIndicator : <=

相关问题