Вот версия, использующая регулярное выражение для определения, какую часть входной строки сгруппировать по:
clear-host
'REGEX 1; org-dummyemail-123 vs org-dummyemail1-joemarmoto'
$groupedByAllButLast = @(
"org-dummyemail-123-AccountName",
"org-dummyemail-123-Email",
"org-dummyemail-123-PAT",
"org-dummyemail-123-PATName",
"org-dummyemail-123-PATValidTo",
"org-dummyemail1-joemarmoto-AccountName",
"org-dummyemail1-joemarmoto-Email",
"org-dummyemail1-joemarmoto-PAT",
"org-dummyemail1-joemarmoto-PATName",
"org-dummyemail1-joemarmoto-PATValidTo"
) | Group-Object -Property @{E={$_ -replace '([^-]+-[^-]+-[^-]+)-.*', '$1'}}
for ([int]$i = 0; $i -lt $groupedByAllButLast.Count; $i++)
{
Write-Verbose $groupedByAllButLast[$i].Name -Verbose
$groupedByAllButLast[$i].Group
}
'REGEX 2; 123 vs joemarmoto'
$groupedByTheNameOrEmailBit = @(
"org-dummyemail-123-AccountName",
"org-dummyemail-123-Email",
"org-dummyemail-123-PAT",
"org-dummyemail-123-PATName",
"org-dummyemail-123-PATValidTo",
"org-dummyemail1-joemarmoto-AccountName",
"org-dummyemail1-joemarmoto-Email",
"org-dummyemail1-joemarmoto-PAT",
"org-dummyemail1-joemarmoto-PATName",
"org-dummyemail1-joemarmoto-PATValidTo"
) | Group-Object -Property @{E={$_ -replace '[^-]+-[^-]+-([^-]+)-.*', '$1'}} #all we've changed is the location of the opening bracket in this line
for ([int]$i = 0; $i -lt $groupedByTheNameOrEmailBit.Count; $i++)
{
Write-Verbose $groupedByTheNameOrEmailBit[$i].Name -Verbose
$groupedByTheNameOrEmailBit[$i].Group
}
Примечание: это в основном тот же подход, что и Lee's ;только вместо использования split
и взятия сегмента сигнатуры мы используем регулярное выражение для захвата всех тех частей строки, которые имеют отношение к нашему ключу ... См. MS Docs для получения дополнительной информации об этом полезномфункция.