web-dev-qa-db-fra.com

Java regex replaceAll multiline

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.

45
Robert

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*/\\*.*\\*/";
74
mikej

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

11
tchrist

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.

Code en action

7
codaddict