older versions of PCRE support in grep used multiline mode by default, which seems to be required by your expression to work and is also on by default in the regex site.
you can add it back using an internal option[1] from PCRE, as shown in the following modified expression from your original example: /\A(?m:\s*^(?:#\w+.*\s*|extern\s+.+)$)*+(?<namespace>\s*namespace(?:\s+utTestNamespace\s*(?>(?<block>{(?:[^{}]*(?&block)*)*}))|(\s*[\w:]*\s*{)(?&namespace)\s*}))\s*\z/ Carlo [1] https://www.pcre.org/current/doc/html/pcre2pattern.html#internaloptions