/
# match a body pattern alone on a line
^\g<body>$
# we'll use (?<name>...){0} to define the pattern \g<name>
# without having to match the pattern at the current position
# a body pattern matches
(?<body>
  # a sequence of
  (?: [^\[\]{}()\n]       # non-delimiters
    | \g<parens>          # parenthesized pattern
    | \g<square_brackets> # bracketed pattern
    | \g<curly_braces>    # braced pattern
  )*
){0}
# a parenthesized pattern matches
(?<parens>
  \(       # an open paren
  \g<body> # a valid body
  \)       # a close paren
){0}
# a bracketed pattern matches
(?<square_brackets>
  \[       # an open square bracket
  \g<body> # a valid body
  \]       # a close square bracket
){0}
# a braced pattern matches
(?<curly_braces>
  \{       # an open curly brace
  \g<body> # a valid body
  \}       # a close curly brace
){0}
/
gmx