It is a well known fact that modern regular expression implementations (most notably PCRE) have little in common with the original notion of regular grammars. For example you can parse the classical example of a context-free grammar {anbn; n>0} (e.g. aaabbb) using this regex (demo):
~^(a(?1)?b)$~
My question is: How far can you go? Is it also possible to parse the context-sensitive grammar {anbncn;n>0} (e.g. aaabbbccc) using PCRE?
Inspired by NullUserExceptions answer (which he already deleted as it failed for one case) I think I have found a solution myself:
Try it yourself: http://codepad.viper-7.com/1erq9v
Explanation
If you consider the regex without the positive lookahead assertion (the
(?=...)part), you have this:This does nothing more than check that there’s an arbitrary number of
as, followed by an equal number ofbs andcs.This doesn’t yet satisfy our grammar, because the number of
as must be the same, too. We can ensure that by checking that the number ofas equals the number ofbs. And this is what the expression in the lookahead assertion does:(a(?-1)?b)c. Thecis necessary so we don’t only match a part of thebs.Conclusion
I think this impressively shows that modern regex is not only capable of parsing non-regular grammars, but can even parse non-context-free grammars. Hopefully this will lay to rest the endless parroting of “you can’t do X with regex because X isn’t regular”