Вы пометили вопрос регулярным выражением, но это, возможно, не лучший инструмент для работы.
Возможно, вам лучше использовать базовые методы компиляции (т. Е. Лексер, питающий простой анализатор конечного автомата).
Ваш лексер определил бы пять токенов: ("[code]", '\ n', "[/ code]", EOF,: все остальные строки :) и ваш конечный автомат выглядит так:
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
РЕДАКТИРОВАТЬ: я вижу другой плакат, обсуждающий возможную необходимость вложения блоков. Этот конечный автомат не справится с этим. Для вложения блоков используйте рекурсивный приличный синтаксический анализатор (не такой простой, но все же достаточно легкий и расширяемый).
РЕДАКТИРОВАТЬ: Axeman отмечает, что этот дизайн исключает использование "[/ code]" в коде. Механизм побега может быть использован, чтобы победить это. Что-то вроде добавления '\' к вашим токенам и добавление:
state token action
------------------------
in \ -->esc-in
esc-in * OUTPUT(token), -->in
out \ -->esc-out
esc-out * OUTPUT(token), -->out
к конечному автомату.
Применяются обычные аргументы в пользу машинно-генерируемых лексеров и парсеров.