RegEx/PowerShell/ScriptBlock.regex.txt

\{
\s{0,}
(?:
\<\# # The opening tag
(?<Help>
    (?:.|\s)+?(?=\#>) # anything until the closing tag
)
\#\> # the closing tag
)?
\s{0,}
(?:
    \s{0,}
    (?<Attributes>?<PowerShell_Attribute>([))
    \s{0,}
){0,}
\s{0,}
(?<ParamBlock>
param?<BalancedCode>{(}
)?
(?:
    \s{0,}
    (?<BeginBlock>begin\s{0,}
    (?<BeginScriptBlock>?<BalancedCode>({)))
    \s{0,}
)?
(?:
    \s{0,}
    (?<ProcessBlock>process\s{0,}
    (?<ProcessScriptBlock>?<BalancedCode>({)))
    \s{0,}
)?
(?:
    \s{0,}
    (?<EndBlock>end\s{0,}
        (?<EndScriptBlock>?<BalancedCode>({)))
    \s{0,}
)?
(?(BeginBlock|ProcessBlock|EndBlock) # If we have a begin, process, or end
    (?:\}) # then match but don't capture the closing }
    | # otherwise, assume we're in an end block
    (?<EndBlock> # An open bracket
        (?> # Followed by...
            [^\{\}]+| # any number of non-bracket character OR
            \{(?<Depth>)| # an open bracket (in which case increment depth) OR
            \}(?<-Depth>) # a closed bracket (in which case decrement depth)
        )*(?(Depth)(?!)) # until depth is 0.
    )\} # followed by a closing bracket))
)