PowerShell中两个以上字符串的最长公共子字符串?

Win*_*red 7 powershell

如何在PowerShell中的字符串数组中找到匹配的字符串:

例:

$Arr = "1 string first",
"2 string second",
"3 string third",
"4 string fourth"
Run Code Online (Sandbox Code Playgroud)

使用此示例,我希望返回:

" string "
Run Code Online (Sandbox Code Playgroud)

我想使用它来查找文件名的匹配部分,然后删除文件名的那一部分(例如从一组mp3文件中删除艺术家的名字),而不必指定应该替换文件名的哪一部分手动.

jon*_*n Z 6

$arr =  "qdfbsqds", "fbsqdt", "bsqda" 
$arr | %{

$substr = for ($s = 0; $s -lt $_.length; $s++) {
           for ($l = 1; $l -le ($_.length - $s); $l++) {
            $_.substring($s, $l);
           }
          } 
$substr | %{$_.toLower()} | select -unique

} | group | ?{$_.count -eq $arr.length} | sort {$_.name.length} | select -expand name -l 1
# returns bsqd
Run Code Online (Sandbox Code Playgroud)
  • 生成输入字符串的所有唯一子串的列表
  • 过滤掉#inputstrings次的子串(即在所有输入字符串中)
  • 根据子字符串的长度对这些过滤的子字符串进行排序
  • 返回此列表的最后一个(即最长)

  • 这可以通过以下方式简化:1)仅为最短的字符串生成子字符串(`$ shortest = $ arr | sort Length | select -first 1`),以及2)按长度顺序生成子字符串:`$ length..1 | foreach {$ l = $ _; 0 ..($ length - $ l)| foreach {$ shortest.Substring($ _,$ l)}} | 其中{@($ arr -match [regex] :: Escape($ _)).Count -eq $ arr.Count} | 选择-first 1` (2认同)