les [] sont des caractères spéciaux dans les expressions régulières qui permettent de définir des classes de caractères :
[a-z] : tout caractère compris entre 'a' et 'z'
[a-zA-Z] : tout caractère compris entre 'a' et 'z' ou 'A' et 'Z'
Pour les utiliser comme caractère d'un motif, il faut utiliser le mécanisme d'échappement (éviter leur interprétation)
- \\[ pour le caractère '['
- \\] pour le caractère ']'
pareil pour les parenthèses, qui permettent de définir des groupes de capture
- \\( pour le caractère '('
- \\) pour le caractère ')'
L'utilisation des codes Unicode ou ASCII, peut marcher, mais risque de dépendre de la table de correspondance des caractères utilisée par la JVM.
Pour le point d'exclamation, je ne sais pas trop, mais tu peux aussi l'échapper, au cas où... (\\!), il est utilisé par les expressions de groupes sans captures :
| (?!X) | X, via zero-width negative lookahead |
| (?<!X) | X, via zero-width negative lookbehind |
Voir la classe Pattern :
[ Lien ], notamment le paragraphe "
Backslashes, escapes, and quoting"
Sinon, il existe un parser tout fait qui gère la lecture des groupes CDATA, pour éviter des travailler par expressions régulières : SAX en implémentant l'interface LexicalHandler (startCDATA() et endCDATA().