PowerShell 中的模糊字符串匹配

hsh*_*hib 1 powershell fuzzy-search

如何在 PowerShell 脚本中进行模糊字符串匹配?

我从不同的来源抓取了不同的人名,并将它们存储在一个数组中。添加新名称时,我喜欢将名称与现有名称进行比较,如果它们模糊匹配,我喜欢将它们视为相同。例如,使用以下数据集:

@("George Herbert Walker Bush",
  "Barbara Pierce Bush",
  "George Walker Bush",
  "John Ellis (Jeb) Bush"  )
Run Code Online (Sandbox Code Playgroud)

我喜欢从给定的输入中看到以下输出:

"Barbara Bush" -> @("Barbara Pierce Bush")
"George Takei" -> @("")
"George Bush"  -> @("George Herbert Walker Bush","George Walker Bush")
Run Code Online (Sandbox Code Playgroud)

至少,我喜欢看到匹配不区分大小写,并且如果可能的话,也足够灵活以处理一定程度的拼写错误。

据我所知,标准库不提供这样的功能。是否有一个易于安装的模块可以实现这一点?

hsh*_*hib 7

PowerShell Gallery 中搜索术语“fuzzy”,我找到了这个包:Communary.PASM

它可以简单地安装:

PS> Install-Package Communary.PASM                                                                                                     
Run Code Online (Sandbox Code Playgroud)

该项目发现,这里在GitHub上。我只是查看了这个示例文件以供参考。

这是我的例子:

$colors = @("Red", "Orange", "Yellow", "Green", "Blue", "Violet", "Sky Blue" )

PS> $colors | Select-FuzzyString Red

Score Result
----- ------   
  300 Red
Run Code Online (Sandbox Code Playgroud)

这是一场完美的比赛,每个角色的最高得分为 100。

PS> $colors | Select-FuzzyString gren

Score Result
----- ------
  295 Green 
Run Code Online (Sandbox Code Playgroud)

它容忍一点缺失的字符。

PS> $colors | Select-FuzzyString blue

Score Result  
----- ------     
  400 Blue       
  376 Sky Blue
Run Code Online (Sandbox Code Playgroud)

可以返回具有不同分数的多个值。

PS> $colors | Select-FuzzyString vioret

# No output
Run Code Online (Sandbox Code Playgroud)

但它不能容忍一点点拼写错误。然后我也试过Select-ApproximateString

PS> $colors | Select-ApproximateString vioret
Violet
Run Code Online (Sandbox Code Playgroud)

这有不同的 API,它只返回单个匹配项或不返回任何内容。此外,它可能不会返回任何内容Select-FuzzyString

这是在 MacOS 和 Communary.PASM 1.0.43 上使用 PowerShell Core v6.0.0-beta.9 测试的。