J'ai un problème avec replaceAll pour une chaîne multiligne:
String regex = "\\s*/\\*.*\\*/";
String testWorks = " /** this should be replaced **/ just text";
String testIllegal = " /** this should be replaced \n **/ just text";
testWorks.replaceAll(regex, "x");
testIllegal.replaceAll(regex, "x");
Ce qui précède fonctionne pour testWorks, mais pas pour testIllegal !? Pourquoi cela et comment puis-je surmonter cela? J'ai besoin de remplacer quelque chose comme un commentaire/* ... */qui s'étend sur plusieurs lignes.
Vous devez utiliser le Pattern.DOTALL
drapeau pour indiquer que le point doit correspondre aux sauts de ligne. par exemple.
Pattern.compile(regex, Pattern.DOTALL).matcher(testIllegal).replaceAll("x")
ou spécifiez le drapeau dans le modèle à l'aide de (?s)
par exemple.
String regex = "(?s)\\s*/\\*.*\\*/";
Ajouter Pattern.DOTALL
à la compilation, ou (?s)
au motif.
Cela fonctionnerait
String regex = "(?s)\\s*/\\*.*\\*/";
Voir Faire correspondre le texte multiligne à l'aide d'une expression régulière
Le méta-caractère .
correspond à tout caractère autre que la nouvelle ligne. C'est pourquoi votre regex ne fonctionne pas pour le cas multi-lignes.
Pour résoudre ce problème, remplacez .
avec [\d\D]
qui correspond à tout caractère , y compris la nouvelle ligne.