"I used Regex at first to do the job but it turned into an unholy mess
(not that it couldn't parse what I needed) and PetitParser was there."
it really depends how you approach this. For example in my case I quickly found out that would be insane to put everything in�� a single string, so I broke the single string to smaller ones and resynthesised it. Each string had a very simple regex quite easy to read if one is familiar syntax.
And as Damien said you could extend String to a more flexible object, but then you get in the realm of SmaCC/ PettitParser.