2010-11-11 15 views
35

Ich habe ein Problem mit dem replaceAll für ein mehrzeiliges string:Java regex replaceAll mehrzeilige

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"); 

Die oben genannten Arbeiten für Testworks, aber nicht für testIllegal !? Warum ist das und wie kann ich das überwinden? Ich muss etwas wie einen Kommentar/* ... */ersetzen, der mehrere Zeilen umfasst.

+0

Und was ist mit dieser Zeichenfolge: '" String s = \ "/ * \";/* Kommentar */"' –

+0

Nun, der Punkt ist, dass die mathing Regex nur am Anfang der Zeichenfolge übereinstimmen sollte. Jetzt sieht es so aus :(? S)^\\ s */\\ *. * \\ */Nicht sicher, wenn es widerwillig (? S) gemacht werden soll^\\ s */\\ *. *? \\ */ – Robert

Antwort

59

Sie müssen die Pattern.DOTALL Flagge verwenden, zu sagen, dass der Punkt sollte Zeilenumbrüche übereinstimmen. z.B.

Pattern.compile(regex, Pattern.DOTALL).matcher(testIllegal).replaceAll("x") 

oder das Flag in dem Muster angeben, unter Verwendung von (?s) z.B.

String regex = "(?s)\\s*/\\*.*\\*/"; 
+1

Dies ist die beste Lösung, da es nicht mit der Regex-Zeichenfolge selbst interagiert, Sie geben nur eine Markierung an. Das wusste ich nicht, Danke! – Robert

+1

Wenn Sie mehrere "mehrzeilige" Kommentare haben, entfernt diese Methode auch Text zwischen diesen Kommentaren. Verwenden Sie stattdessen die von Boris veröffentlichte Methode. – lepe

7

Das Metazeichen . entspricht einem anderen Zeichen als newline. Aus diesem Grund funktioniert Ihre Regex nicht für mehrere Zeilen.

Um dies zu beheben . mit [\d\D] ersetzen, die jede Zeichen einschließlich Newline entspricht.

Code In Action

+1

Das Vertauschen von '[\ d \ D]' für '.' (was normalerweise' [^ \ n] 'bedeutet, zumindest im' Pattern.UNIX_LINES' Modus) erscheint mir unangemessen, weil es nicht offensichtlich ist was es macht, weil es 6 Zeichen für 1 gibt, und weil es andere Möglichkeiten gibt, dies zu tun. – tchrist

8

Pattern.DOTALL zum Kompilieren hinzufügen oder (?s) das Muster.