Java正则表达式replaceAll多行模式

54

我有一个关于多行字符串的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!为什么?如何解决?我需要替换跨越多行的注释 /*...*/。

那这个字符串怎么办:“String s = "/ *"; / 注释 /”? - Bart Kiers
重点是匹配正则表达式应该只在字符串开头匹配。现在它看起来像这样:(?s)^\s*/\.\/ 不确定是否要使其变得勉强一些 (?s)^\s/\.?\*/。 - Robert
3个回答

96

您需要使用Pattern.DOTALL标志来表示点号应匹配换行符。例如:

Pattern.compile(regex, Pattern.DOTALL).matcher(testIllegal).replaceAll("x")
或者,您可以使用模式中的 (?s) 指定标志,例如。
String regex = "(?s)\\s*/\\*.*\\*/";

1
这是最好的解决方案,因为它不与正则表达式字符串本身交互,你只需指定一个标志。我之前不知道,谢谢! - Robert
1
如果您有多个“多行”注释,此方法也将删除这些注释之间的文本。请改用Boris发布的方法。 - lepe

16

1
不幸的是,这与String.replaceAll结合使用无效。 :( - Stefan Endrullis

7
字符.匹配除换行符以外的任何字符。这就是为什么你的正则表达式对于多行情况无法工作的原因。

为了解决这个问题,将.替换为[\d\D],它可以匹配任何字符,包括换行符。

代码演示


1
在正则表达式中,将 . 替换为 [\d\D] 似乎不太合适,因为它并不明显其作用,而且每替换一个字符就需要6个字符的代价,此外还有其他更好的方法可以实现这一功能。 - tchrist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接