[Note: There is a full account of my recursive regex idea in this article.]
I've found the bug in my PCRE patch, which is partly to do with the way * repetitions are handled. But you don't actually need to use iterative repetitions any more, because you can replace iteration with recursion! /a*/ can be rewritten as /((a(?1))?)/. And if you do that, you sometimes avoid triggering the bug. So you can test for matching XML-style tags like this:
ã^(<\w+/>|<(\w+)>([^<>]|(?1)|)(?3)\2>)$ãI'll fix the bug soon...
I've also managed to prove that all context-free languages can indeed be expressed. The proof takes the form of an algorithm for turning a context-free grammar into a regex:
/(|\(((?1)|x(?2))\)(?1))/