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:使用正则表达式从块注释中去除斜线和星号的主要内容,如果未能解决你的问题,请参考以下文章