Java 正则表达式 replaceAll 多行

Posted

技术标签:

【中文标题】Java 正则表达式 replaceAll 多行【英文标题】:Java regex replaceAll multiline 【发布时间】:2011-05-08 10:37:07 【问题描述】:

我对多行字符串的 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 = \"/*\"; /* comment */" 嗯,重点是数学正则表达式应该只匹配字符串的开头。现在看起来像这样:(?s)^\\s*/\*.*\*/ 不确定,如果让它不情愿 (?s)^\\s*/\*.*?\*/ 【参考方案1】:

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

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

或者使用(?s) 指定模式中的标志,例如

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

【讨论】:

这是最好的解决方案,因为它不与正则表达式字符串本身交互,您只需指定一个标志。我不知道,谢谢! 如果您有多个“多行” cmets,此方法也会删除这些 cmets 之间的文本。请改用鲍里斯发布的方法。【参考方案2】:

Pattern.DOTALL 添加到编译中,或将(?s) 添加到模式中。

这样就可以了

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

看 Match multiline text using regular expression

【讨论】:

不幸的是,这不能与 String.replaceAll 结合使用。 :(【参考方案3】:

元字符. 匹配除换行符以外的任何字符。这就是为什么您的正则表达式不适用于多行大小写的原因。

要解决此问题,请将. 替换为匹配任何 字符(包括换行符)的[\d\D]

Code In Action

【讨论】:

[\d\D] 换成.(这通常意味着[^\n],至少在Pattern.UNIX_LINES 模式下)让我觉得不合适,因为它在做什么并不明显,因为它是1 个 6 个字符,因为还有其他方法可以做到这一点。

以上是关于Java 正则表达式 replaceAll 多行的主要内容,如果未能解决你的问题,请参考以下文章

java replaceAll 正则表达式的用法

正则表达式元字符“*”和“*?”在 JAVA 的 replaceAll() 方法中行为异常[重复]

java replace 正则表达式

将java字符串转换为与replaceAll中的正则表达式兼容的字符串[重复]

java String的replaceAll方法替换中间部分下划线以后的文字的正则表达式

Java String.replaceAll()方法