【问题标题】:deleting all text except what matches regex java删除除匹配正则表达式 java 之外的所有文本
【发布时间】:2016-10-23 01:43:59
【问题描述】:

我有正则表达式,应该删除 cmets(是的,这很糟糕,但对我来说它有效)

String regex = (^\/\/.*)|(\s+\/\/.*)|((\/\*)(.|\n)+?(\*\/));

此代码应删除所有评论

Pattern.compile(regex).matcher(some text).replaceAll(" ");

但我怎样才能删除所有除了正则表达式?

例如: 如果我有这样的字符串:

/*Comments it's cool*/ public static void foo(){}

我的正则表达式匹配 cmets,但我需要删除不匹配的内容,所以它看起来像:

/*Comments it's cool*/

【问题讨论】:

  • 只是连接所有匹配项?
  • 哦,来吧 - 匹配正则表达式并将它们附加到结果字符串/缓冲区/等。顺便说一句,你真的很高兴使用(.|\n)+? 吗?至少使用.*?(使用(?s) 内联修饰符)。但是,对于多行 cmets,有更好的正则表达式。
  • (^\/\/.*)|(\s+\/\/.*)(\s*\/\/.*) 相同。
  • 顺便说一句。您可能想查看我的查询/答案:How to remove C-style comments from code

标签: java regex string


【解决方案1】:

基本上,您可以匹配正则表达式匹配的内容,然后连接匹配的文本。这要容易得多。

至于 删除 除了原始模式匹配之外的所有正则表达式,您可以考虑使用捕获可选组捕获整个模式,并使用 . 匹配其后的任何字符。

说,你的模式是abc。它匹配abc。但是现在,您需要匹配相反的内容,即您的正则表达式不匹配的所有内容。使用

(?s)(abc)?.

并替换为$1。请参阅regex demo

可能需要对换行符进行一些调整。如果您不想删除换行符,请不要使用 DOTALL 修饰符。如果要使用它,请将原始模式中的. 替换为[^\n\r]。请记住,您将能够使用一些 (\r?\n|\r){2,} 模式(以及 $1 反向引用)来缩小空行。

所以,你的正则表达式是

String regex = "^\\s*//.*|/\*[^*]*\*+(?:[^/*][^*]*\*+)*/";

/\*[^*]*\*+(?:[^/*][^*]*\*+)*/ 匹配多行 cmets,^\\s*//.* 匹配单行 cmets。

要使其删除除匹配项之外的所有内容,请使用

String regex = "(?sm)(^\\s*//[^\r\n]*|/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/)?.";

并替换为$1 反向引用。请参阅regex demo(基于ClasG demo)。请注意,我还为 ^ 添加了一个 (?m) MULTILINE 修饰符以匹配行首。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2021-05-26
    相关资源
    最近更新 更多