Java:使用正则表达式从块注释中去除斜线和星号

Posted

技术标签:

【中文标题】Java:使用正则表达式从块注释中去除斜线和星号【英文标题】:Java: Strip Slashes and Stars from Block Comments using Regex 【发布时间】:2013-04-09 20:29:24 【问题描述】:

我正在做一个个人项目,我需要从这样的输入字符串中提取实际的 cmets。

案例一:/* Some useful text */

输出:Some useful text

案例2:/*** This is formatted obnoxiously**/

输出:This is formatted obnoxiously

案例3:

    /**

    More useful
information

    */

输出:More useful information

案例 4:

/**
Prompt the user to type in 
the number. Assign the number to v
*/

输出:Prompt the user to type in the number. Assign the number to v

我正在使用 Java,我尝试使用诸如 String.replace 之类的简单方法替换 /**/,但由于注释可以像上面那样以不同的方式格式化,replace 方法似乎不是是一种可行的方法来做到这一点。如何使用正则表达式实现上述输出?

Here 是我正在使用的测试注释文件。

【问题讨论】:

【参考方案1】:

尝试类似:

"/\\*+\\s*(.*?)\\*+/"

点也应该匹配新行:

Pattern p = Pattern.compile("/\\*+\\s*(.*?)\\*+/", Pattern.DOTALL);

编辑

 Pattern p = Pattern.compile("/\\*+\\s*(.*?)\\*+/", Pattern.DOTALL); 
 Matcher m = p.matcher("/*** This is formatted obnoxiously**/");
 m.find();
 String sanitizedComment = m.group(1); 
 System.out.println(sanitizedComment);

【讨论】:

. 与 Java 中的换行符不匹配(无论如何默认情况下都不匹配,不确定是否有办法设置它)。你需要(.|\n) @Dukeling:有一种方法可以在 Java 中设置它(DOTALL 选项)。写(.|\n) 不是一个好主意,因为你可能会漏掉一些字符。 . 不仅在 Java 中不包括 \n @Dukeling nhahtdh 是对的,我已经更新了我的答案,向您展示如何使点匹配新行 @Stephan 没用。我得到了IllegalStateException,因为没有匹配项。 Pattern p = Pattern.compile("/\\*+\\s*(.*?)\\*+/", Pattern.DOTALL); Matcher m = p.matcher(matchedComment); String sanitizedComment = m.group(); System.out.println(sanitizedComment); @Stephan,我按照你说的做了,在 O 上传的代码中突出显示的文件之前一切正常here【参考方案2】:

您可以使用以下正则表达式:

String newString = oldString.replaceAll("/\\*+\\s*|\\s*\\*+/", "");

编辑

要摆脱换行符,您可以执行以下操作:

String regex = "/\\*+\\s*|\\s*\\*+/|[\r\n]+";
String newString = oldString.replaceAll(regex, "");

【讨论】:

太棒了,它奏效了。谢谢!现在我还有一个问题,我正在使用以下转义字符串在文件中查找 cmets。 //.*|(\"(?:\\\\[^\"]|\\\\\"|.)*?\")|(?s)/\\*.*?\\*/ 我怎样才能让它只找到 /* ... */ cmets 而不是单行 cmets ( // ... ) ? 嗯,看起来它不适用于这样的情况:/** Prompt the user to type in the number. Assign the number to v */ 这件事不能让我空白行,我会更新问题。 @NullGeo:为了摆脱换行符,我只需添加一个.replaceAll(System.getProperty("line.separator"), "") @Keppil:您应该再次通过以删除行分隔符。不要只是删除它们;你最终可能会一起运行单词。你想要做的是规范化剩余的空白(例如.replaceAll("\\s+", " ");)。至于line.separator 属性,请参阅this answer 以了解其无效性的讨论。 @AlanMoore:当然,如果需要用空格替换换行符,则需要第二遍。根据 OP 用例,可能还需要进行其他小的调整,但我认为调整上面的代码以适应这些额外的需求是相当简单的。

以上是关于Java:使用正则表达式从块注释中去除斜线和星号的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式去除 HTML 注释

正则表达式

Java正则表达式

用正则表达式批量删除注释(//abc和/*abc*/)

正则表达式去除 phpdoc 多行注释

从补丁文件中去除 C 注释的方法