web-dev-qa-db-ja.com

Java regex replaceAll multiline

複数行の文字列のreplaceAllに問題があります。

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

上記はtestWorksで機能しますが、testIllegalでは機能しません!?それはなぜですか、どうすればこれを克服できますか?複数行にわたるコメント/ * ... * /のようなものを置き換える必要があります。

45
Robert

Pattern.DOTALLフラグを使用して、ドットが改行と一致する必要があることを示す必要があります。例えば.

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

または、(?s)を使用してパターンにフラグを指定します。

String regex = "(?s)\\s*/\\*.*\\*/";
74
mikej

追加 Pattern.DOTALLをコンパイルするか、(?s)パターンに。

これはうまくいくでしょう

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

正規表現を使用した複数行テキストの一致 を参照してください

11
tchrist

メタ文字.は、改行以外の任意の文字に一致します。これが、複数行の場合に正規表現が機能しない理由です。

これを修正するには、. with [\d\D]は、改行を含むany文字に一致します。

アクション中のコード

7
codaddict