问题
I have a problem with the replaceAll for a multiline string:
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");
The above works for testWorks, but not for testIllegal!? Why is that and how can I overcome this? I need to replace something like a comment /* ... */ that spans multiple lines.
回答1:
You need to use the Pattern.DOTALL
flag to say that the dot should match newlines. e.g.
Pattern.compile(regex, Pattern.DOTALL).matcher(testIllegal).replaceAll("x")
or alternatively specify the flag in the pattern using (?s)
e.g.
String regex = "(?s)\\s*/\\*.*\\*/";
回答2:
Add Pattern.DOTALL
to the compile, or (?s)
to the pattern.
This would work
String regex = "(?s)\\s*/\\*.*\\*/";
See Match multiline text using regular expression
回答3:
The meta character .
matches any character other than newline. That is why your regex does not work for multi line case.
To fix this replace .
with [\d\D]
that matches any character including newline.
Code In Action
来源:https://stackoverflow.com/questions/4154239/java-regex-replaceall-multiline