RegEx/Markdown/CodeBlock.regex.ps1

<#
.Synopsis
    Matches a code block
.Description
    Matches a Markdown code block.
    
    Code blocks can start/end with 3 or more backticks or tildas, or 4 indented whitespaces
#>

param(
# If set, will only match fenced code blocks.
[Parameter(ValueFromPipelineByPropertyName)]
[switch]
$Fenced,

# The languages
[Parameter(ValueFromPipelineByPropertyName)]
[Alias('InfoText')]
[string]
$Language
)

process {



    
$fencedBlock = 


@"
(?<FenceChar>[``\~]){3,} # Code fences start with tildas or backticks, repeated at least 3 times
$(
if (-not $Language) {
@"
(?<Language>[\S]+)? # Match an optional language (non-whitespace characters)
"@
} else {
@"
(?<Language> # Match a specific language
$language
)
"@
}
)
\s{0,} # Match but do not capture initial whitespace.
(?<Code> # Capture the <Code> block
    (?:.|\s){0,}? # This is anything until
    (?=\z|\k<FenceChar>{3,}) # the end of the string or the same matching fence chars
)
(?>\z|\k<FenceChar>{3,})
"@



$fourSpacesBlock = @"
(?m)
(^\s{4}(?<Code>\s{0,}\S.+?)$){1,} # Match one or more lines starting with at least four whitespace characters
"@


if ($Language) {
@"
(?>
    $($fencedBlock -join '
|
')
)
"@

} else {
@"
(?>
$($fencedBlock -join '
|
')
|
$fourSpacesBlock
)
"@

}

}