Has etiquetado la pregunta regex, pero esta puede no ser la mejor herramienta para el trabajo.
Puede ser mejor utilizar técnicas básicas de compilación de compiladores (es decir, un lexer que alimenta un analizador de máquina de estado simple).
Su léxico identificaría cinco fichas: ("[code]", '\ n', "[/ code]", EOF,: todas las demás cadenas :) y su máquina de estados se parece a:
state token action
------------------------
begin :none: --> out
out [code] OUTPUT(token), --> in
out \n OUTPUT(break), OUTPUT(token)
out * OUTPUT(token)
in [/code] OUTPUT(token), --> out
in * OUTPUT(token)
* EOF --> end
EDITAR: Veo otro cartel que habla de la posible necesidad de anidar los bloques. Esta máquina de estado no manejará eso. Para los bloques de anidación, use un analizador sintáctico decente recursivo (no del todo simple, pero aún lo suficientemente fácil y extensible).
EDITAR: Axeman observa que este diseño excluye el uso de "[/ code]" en el código. Un mecanismo de escape puede usarse para vencer esto. Algo así como agregar '\' a sus tokens y agregar:
state token action
------------------------
in \ -->esc-in
esc-in * OUTPUT(token), -->in
out \ -->esc-out
esc-out * OUTPUT(token), -->out
a la máquina de estado.
Se aplican los argumentos habituales a favor de los lexers y analizadores generados por máquina.
Estoy un poco sorprendido por la profundidad de la discusión que ha generado esta pregunta aparentemente simple. Upvote. – dmckee
Esto es increíblemente fácil en .NET regex ... lástima que sea java :( –
Te lo digo, es cualquier cosa menos simple :) –