PowerShell中的模糊字符串匹配
Posted
技术标签:
【中文标题】PowerShell中的模糊字符串匹配【英文标题】:Fuzzy string match in PowerShell 【发布时间】:2018-04-25 15:27:03 【问题描述】:如何在 PowerShell 脚本中进行模糊字符串匹配?
我有不同来源的不同人名集合,并将它们存储在一个数组中。当我添加一个新名称时,我喜欢将该名称与现有名称进行比较,如果它们模糊匹配,我喜欢认为它们是相同的。例如,数据集为:
@("George Herbert Walker Bush",
"Barbara Pierce Bush",
"George Walker Bush",
"John Ellis (Jeb) Bush" )
我希望看到给定输入的以下输出:
"Barbara Bush" -> @("Barbara Pierce Bush")
"George Takei" -> @("")
"George Bush" -> @("George Herbert Walker Bush","George Walker Bush")
至少,我希望匹配不区分大小写,并且尽可能灵活地处理某种程度的拼写错误。
据我所知,标准库不提供此类功能。有没有一个易于安装的模块可以做到这一点?
【问题讨论】:
如果只是匹配其他字符串中的字符串,the -Match operator would do. 或-like
operator。
【参考方案1】:
在PowerShell Gallery 搜索“模糊”一词,我找到了这个包:Communary.PASM。
它可以简单地安装:
PS> Install-Package Communary.PASM
该项目在 GitHub 中找到 here。我只是看了this examples file作为参考。
这是我的例子:
$colors = @("Red", "Orange", "Yellow", "Green", "Blue", "Violet", "Sky Blue" )
PS> $colors | Select-FuzzyString Red
Score Result
----- ------
300 Red
这是一场完美的比赛,每个角色的最高得分为 100。
PS> $colors | Select-FuzzyString gren
Score Result
----- ------
295 Green
它可以容忍一些缺失的字符。
PS> $colors | Select-FuzzyString blue
Score Result
----- ------
400 Blue
376 Sky Blue
可以返回多个具有不同分数的值。
PS> $colors | Select-FuzzyString vioret
# No output
但它不能容忍一点点拼写错误。然后我也试了Select-ApproximateString
:
PS> $colors | Select-ApproximateString vioret
Violet
这有不同的 API,它只返回一个匹配项或不返回任何内容。当Select-FuzzyString
这样做时,它也可能不会返回任何东西。
这是在 MacOS 和 Communary.PASM 1.0.43 上使用 PowerShell Core v6.0.0-beta.9 测试的。
【讨论】:
以上是关于PowerShell中的模糊字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章