【问题标题】:Java regex replaceAll multilineJava 正则表达式 replaceAll 多行
【发布时间】: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*/\*.*?\*/

标签: java regex replaceall


【解决方案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 个字符,因为还有其他方法可以做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
相关资源
最近更新 更多