Compress-RegEx.ps1

function Compress-Regex
{
    <#
    .SYNOPSIS
        Compresses Regular Expressions
    .DESCRIPTION
        Compresses a Regular Expression, removing all whitespace and comments.

        This will make a regular expression much more difficult to read, and a bit shorter.
    .EXAMPLE
        New-Regex -Description "This is a description of a regex nobody will care about" |
            New-Regex -Name Width @(
                ?<Decimals>
            ) |
            New-Regex -Name Height @(
                ?<Decimals>
            ) | Compress-Regex
    #>

    param(
    # The regular expression to compress.
    [Parameter(Mandatory,
        ValueFromPipeline,
        ValueFromPipelineByPropertyName,
        Position=0)]
    [Alias('RegularExpression','Pattern','Expression')]
    [Regex]
    $Regex,

    # The Match Timeout.
    # By default, this value will be carried over from the -RegEx.
    [timespan]
    $MatchTimeout = '00:00:01'
    )

    process {
        # Create a new regex from the old:
        [Regex]::new(
            (
                # To compress the regex, split it by newlines
                "$Regex" -split '(?>\r\n|\n)' -replace 
                    # and strip comments
                    '(?<!\\)#.+$' -join ([Environment]::NewLine) -replace 
                    # and strip whitespace.
                    '[\s\n\r]'
            ),
            # We'll keep the regex options should remain the same, for now.
            $Regex.Options,
            $(
                # If we provided a -MatchTimeout
                if ($PSBoundParameters["MatchTimeout"]) {
                    $MatchTimeout # use that
                } elseif ($Regex.MatchTimeout.TotalSeconds -gt 0) {
                    $Regex.MatchTimeout # otherwise, carry the timeout from the [Regex]
                } else {
                    $MatchTimeout # and if it didn't have one, use the default for -MatchTimeout.
                }
            )
        )
    }
}