Private/Utils/Normalize-PolicyName.ps1

function Normalize-PolicyName {
    <#
    .SYNOPSIS
        Normalize policy name for consistent matching.
     
    .DESCRIPTION
        Removes versioning suffixes, preview/deprecated tags, and standardizes formatting
        to enable reliable policy name comparison across different sources.
     
    .PARAMETER Name
        The policy name to normalize.
     
    .EXAMPLE
        Normalize-PolicyName "Deploy VM Backup [Preview] v2.1.0"
        Returns: "deploy vm backup"
     
    .OUTPUTS
        String - Normalized lowercase policy name
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$Name
    )
    
    if ([string]::IsNullOrWhiteSpace($Name)) { 
        return "" 
    }
    
    $n = $Name.Trim()
    
    # Remove common suffixes
    $n = $n -replace '\s*\[Preview\]\s*$', ''
    $n = $n -replace '\s*\(Deprecated\)\s*$', ''
    $n = $n -replace '\s*\(Preview\)\s*$', ''
    $n = $n -replace '\s*\(.*?version.*?\)\s*$', ''
    $n = $n -replace '\s*\bv?\d+(\.\d+)*\s*$', ''
    
    # Standardize dashes and spacing
    $n = $n -replace '[–—−]', '-'
    $n = $n -replace '\s*-\s*', ' - '
    $n = $n -replace '\s+', ' '
    
    return $n.ToLowerInvariant()
}