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中的正则表达式兼容的字符串[重复]