2010-11-11 86 views
35

我与的replaceAll的多串了一个问题:Java的正则表达式的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!? 这是为什么,我该如何克服这一点?我需要替换类似于多行的评论/ * ... * /。

+0

那么这个字符串怎么样:'“String s = \”/ * \“;/* comment * /”' – 2010-11-11 12:28:04

+0

那么问题是mathing正则表达式应该只匹配字符串的开头。现在它看起来像这样:(?s)^ \\ s */\\ *。* \\ * /不确定,但如果使它不愿意(?s)^ \\ s */\\ *。*? \\ */ – Robert 2010-11-11 12:41:01

回答

59

您需要使用Pattern.DOTALL旗说,应点匹配换行符。例如

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

或使用(?s)例如在模式中指定标志。

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

这是最好的解决方案,因为它不与正则表达式字符串本身交互,你只需指定一个标志。我不知道,谢谢! – Robert 2010-11-11 12:31:43

+1

如果您有多个“多行”注释,则此方法将删除这些注释之间的文本。改用Boris发布的方法。 – lepe 2011-11-29 03:58:17

7

元字符.与换行符以外的任何字符匹配。这就是为什么你的正则表达式不适用于多线情况。

修复此替换.[\d\D]匹配任何字符包括换行符。

Code In Action

+1

在'[\ d \ D]'中换换'.'(通常意味着'[^ \ n]',至少在'Pattern.UNIX_LINES'模式中)至少在我看来是不合适的,因为它并不明显它在做什么,因为它是1个字符的6个字符,并且因为还有其他方式来执行此操作。 – tchrist 2010-11-11 12:25:12

8

添加Pattern.DOTALL到编译,或(?s)到图案。