Vous avez balisé la question regex, mais ce n'est peut-être pas le meilleur outil pour ce travail.
Vous pourriez utiliser les techniques de compilation de base du compilateur (c'est-à-dire une lexeur alimentant un simple analyseur de machine d'état).
Votre lexer identifierait cinq jetons: ("[code]", '\ n', "[/ code]", EOF,: toutes les autres chaînes :) et votre machine d'état ressemble:
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
EDIT: Je vois d'autres affiches discutant du besoin éventuel d'imbrication des blocs. Cette machine d'état ne gérera pas cela. Pour les blocs d'imbrication, utilisez un analyseur correct récursif (pas tout à fait si simple mais toujours assez facile et extensible).
EDIT: Axeman note que cette conception exclut l'utilisation de "[/ code]" dans le code. Un mécanisme d'échappement peut être utilisé pour battre cela. Quelque chose comme ajouter «\» à vos jetons et ajouter:
state token action
------------------------
in \ -->esc-in
esc-in * OUTPUT(token), -->in
out \ -->esc-out
esc-out * OUTPUT(token), -->out
à la machine d'état.
Les arguments habituels en faveur des lexers générés par machine et des parseurs s'appliquent.
Je suis un peu surpris de la profondeur de la discussion que cette question apparemment simple a généré. Upvote. – dmckee
Ceci est incroyablement facile dans .NET regex ... tant pis c'est java :( –
Je vous le dis, tout sauf simple :) –