Comment puis-je trouver les chaînes assorties dans une gamme de chaînes dans PowerShell:
Exemple: p> Utilisation de cet exemple, je veux que cela a été renvoyé: p > " string "
4 Réponses :
Si je comprends votre question:
$Arr = "1 string first", "2 string second", "3 string third", "4 string fourth"
$Arr -match " string " | foreach {$_ -replace " string ", " "}
OP vous demande comment constater que la "chaîne" est la commune.
C'est correct. J'essaie de trouver cette "chaîne" est la commune.
Si cela (le nom de l'artiste, etc.) ne sera qu'un mot unique: mise à jour: p> implémentation qui semble fonctionner pour plusieurs mots (constatation la plus longue sous-chaîne commune des mots): p>
Cela peut être n'importe quoi, un ensemble de mots, pourrait avoir des traits de soulignement, etc.
@Winfred - alors il devient plus complexe si vous voulez un ensemble de mots ... vous devrez passer du temps à obtenir le code ...
Le pire des cas, je peux essayer quelque chose comme convertir chaque chaîne en un chararray, puis commencer à comparer les caractères individuels. Mais les matrices de Mufti-dimension me font mal la tête vraiment mal. J'espère que quelqu'un pourrait avoir un morceau de code qui le fait déjà.
@Winfred - Comme il s'agit d'un problème assez commun, j'ai écrit quelque chose qui semble fonctionner. Réponse mise à jour. Essayez-le / développez-le.
Il fonctionne sur des mots simples ou plusieurs mots, mais il tombe lorsque les chaînes ne contiennent pas d'espaces: $ arr = "nom_artist_song", "nom_artist_song", "nom_artist_sopretty" devrait revenir: "nom_artist_" mais retourne: "Nom_artist_sopretty"
@Winfred - comme je l'ai dit, travaillez dessus. Quoi qu'il en soit, mis à jour pour votre cas. Les gens considèrent généralement _ code> faire partie du mot et non séparé. Si vous demandez plus de modifications, cela devient trop localisé et ne digne pas une réponse ici puisque vous n'avez rien donné de code vous-même. Utilisez-le donc, apprenez PowerShell et apportez des modifications dont vous avez besoin.
Merci pour l'effort. J'y penserai un peu plus.
Voici une fonction "la plus longue sous-chaînes" pour deux chaînes de PowerShell (basée sur les wikibooks C # Exemple ): Pour utiliser ceci pour plus de deux chaînes, utilisez-le comme ceci: strong> p> Function get-LongestCommonSubstringArray
{
Param(
[Parameter(Position=0, Mandatory=$True)][Array]$Array
)
$PreviousSubString = $Null
$LongestCommonSubstring = $Null
foreach($SubString in $Array)
{
if($LongestCommonSubstring)
{
$LongestCommonSubstring = get-LongestCommonSubstring $SubString $LongestCommonSubstring
write-verbose "Consequtive diff: $LongestCommonSubstring"
}else{
if($PreviousSubString)
{
$LongestCommonSubstring = get-LongestCommonSubstring $SubString $PreviousSubString
write-verbose "first one diff: $LongestCommonSubstring"
}else{
$PreviousSubString = $SubString
write-verbose "No PreviousSubstring yet, setting it to: $PreviousSubString"
}
}
}
Return $LongestCommonSubstring
}
get-LongestCommonSubstringArray $Arr -verbose
Devrait être capable de l'exécuter plusieurs fois, combinant les résultats. Sauf si je ne suis tout simplement pas dormi, la plus longue sous-chaîne commune doit être transitive, alors quelque chose comme cela devrait fonctionner: LCS (LCS (LCS (1 2) 3) 4).
Je ne pense pas que le LCS soit transitif. Considérons ces chaînes: "Quelques grandes chaînes", "une autre grande chaîne", "quelque chose". Si vous avez fait des LCS (3, LCS (1, 2)), vous obtiendrez «certains» au lieu de «certains»
Vous avez raison. Pour mon problème particulier, ce n'était pas un problème, mais je ne vais pas signaler la question répondue. Je reviendrai le code un autre moment et j'essaie de trouver un meilleur moyen de le résoudre.
$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
produce a list of all the unique substrings of the inputstrings
filter for substrings that occur #inputstrings times (i.e. in all input strings)
sort these filtered substrings based on the length of the substring
return the last (i.e. longest) of this list
Cela peut être simplifié quelque peu par 1) uniquement générer des sous-chaînes pour la chaîne la plus courte ( $ courte la plus courte = $ Art | Sélectionnez-lefirst 1 code>) et 2) générant les substrings de la longueur: < code> $ longueur..1 | foreach {$ l = $ _; 0 .. ($ de longueur - $ l) | foreach {$ shortest.Substring ($ _, $ l)}} | où {@ ($ arr -match [regex] :: évasion ($ _)). Compte -eq $ arr.fount} | Sélectionnez -First 1 Code>
On dirait que vous recherchez la plus longue sous-chaîne commune. Une recherche rapide et je ne vois aucune implémentation de PowerShell de cet algorithme en ligne.
Merci mec .. ça me met dans la bonne direction. J'ai trouvé un C # LongestCommeztring, qui n'a pris que quelques minutes à convertir en PowerShell. Temps de mettre à jour la question.