﻿# Matches a PowerShell script block
\{
\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,}
    (?<NamedBlock>(?:begin|dynamicParam|process|end)\s{0,}
    (?<NamedScriptBlock>?<BalancedCode>({)))
    \s{0,}
)?
(?(NamedBlock) # 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))
)