It looks like you are using a s/// substitution to repeatedly search from the very start of the string and then snip out already-processed substrings so that you don't encounter them again. It would be so much easier (and faster, if the string/file is huge) to use the /g modifier on a m// match and deal with each sub-string as it is found. See Modifiers in perlre, also see perlretut, perlrequick.
A little whitespace and formatting never hurts, either. See the /x modifier in the references above.
Another suggestion is to factor out sub-patterns with a collection of qr// regex object definitions (see references above). As with code in general, such factoring allows you to better understand and control the final regex. An example of such factoring is in the code of my original reply.
OTOH, since it looks like you may be trying to parse XML, the best advice might be to not use regexes at all; use one of the many fine XML parser modules from CPAN: see XML::Parse (others will be better able than I to advise you on this).
In reply to Re^3: pattern matching (greedy, non-greedy,...)
by AnomalousMonk
in thread pattern matching (greedy, non-greedy,...)
by cacophony777
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |