RegEx/RegularExpression/Group.regex.txt

# Matches groups in a regular expression
(?<!\\)\( # An open parenthesis
(?<HasOptions>\?)? # Any group options are preceeded by a ?
(?(HasOptions)(?: # If we have options, figure out what they are:
    (?> # It can be only one:
        (?:\<(?<GroupName>\w+)\>) # a <GroupName>
        | (?<Atomic>\>) # An atomic expression atomic (>)
        | (?<NoCapture>\:) # A non capturing expression (:)
        | (?<LookBehind>\<\=) # A lookbehind (<=)
        | (?<NegativeLookBehind>\<\!) # A negative lookbehind (<!)
        | (?<LookAhead>\=) # A lookahead (=)
        | (?<NegativeLookAhead>\!) # A negative lookahead (!)
        | (?<If>\( # Last but not least, it can be an if, which is a nested expression
            (?>
                \\\( # an escaped open parenthesis OR
                | \\\) # an escaped close parenthesis OR
                | [^\(\)]+ # any number of non-parenthesis characters OR
                | \((?<Depth>) # an open parenthesis (in which case increment depth) OR
                | \)(?<-Depth>) # a closed parenthesis (in which case decrement depth)
            )*(?(Depth)(?!)) # and thus has to use a balancing expression to match until depth is 0
            \) # don't forget the closing parenthesis!
        )
    )
))
(?<Pattern> # Now we are in the pattern body.
(?> # We just need to capture...
      \\\( # an escaped open parenthesis OR
    | \\\) # an escaped close parenthesis OR
    | [^\(\)]+ # any number of non-parenthesis characters OR
    | \((?<Depth>) # an open parenthesis (in which case increment depth) OR
    | \)(?<-Depth>) # a closed parenthesis (in which case decrement depth)
)*(?(Depth)(?!)) # until depth is 0.
)\) # then close out our <Pattern> group and and don't forget the closing parenthesis!