Java 代码文件中多行注释的正则表达式
我正在试图为源文件中的注释编写一个模式 它们可以是Java 代码文件中多行注释的正则表达式,java,regex,Java,Regex,我正在试图为源文件中的注释编写一个模式 它们可以是/**注释**/或 /** * comments * comments **/ 所以我写的是 \/\*\*([a-zA-Z0-9\n ]*)*\*\*\/ 我这样做是因为我假设新行只是一个字符,并将其添加到方括号中 我可以想出两个选择: (?s)\/\*\*(?:(?!\*\*\/).)*\*\*\/ 或 第一个是如果你不介意点匹配新行,第二个是如果你介意 非捕获组将使其速度提高一个等级,而此负前瞻结构将阻止匹配***/,并匹配任何其他内容
/**注释**/
或
/**
* comments
* comments
**/
所以我写的是
\/\*\*([a-zA-Z0-9\n ]*)*\*\*\/
我这样做是因为我假设新行只是一个字符,并将其添加到方括号中 我可以想出两个选择:
(?s)\/\*\*(?:(?!\*\*\/).)*\*\*\/
或
第一个是如果你不介意点匹配新行,第二个是如果你介意
非捕获组将使其速度提高一个等级,而此负前瞻结构将阻止匹配
***/
,并匹配任何其他内容。您可以尝试以下代码来检测单行注释和多行通信
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class HelloWorld{
public static void main(String []args){
String test="/**\n"
+"* some text\n"
+"* some text\n"
+"**/"
+"non comment\n"
+"/**some text \n**/" +
"//single line comment";
int count=0;
String pattern_string="(\\/\\/)|(\\/\\*(\\*)?([\\*\\w\\d\\s]*(\\n)?)*(\\*)?\\*\\/)";
Pattern pattern=Pattern.compile(pattern_string);
Matcher matcher=pattern.matcher(test);
while(matcher.find())
{
count++;
}
System.out.println(count);
}
}
这将计算代码中的注释总数。试试这个
匹配多行注释可以通过将其划分为“安全”部分来完成,即保证不包含
*/
,但它们仍应匹配任何数量的其他*
和/
的部分。这可以通过要求任何*
和/
之间至少有一个“安全”字符来实现。安全字符是除*
和/
之外的任何字符。然后每个部分将如下所示:
\**[^\*\/]+\/*
安全部分以任意数量的*
开头,后跟至少一个安全字符,后跟任意数量的/
。多行注释可能以许多*
结尾,后面没有安全字符,或者以任何数量的/
开头,前面没有安全字符,因此也必须考虑这些注释
结果是\/\*\/*
后跟任意数量的安全部件,后跟\*+\/
,即
\/\*\/*((\**[^\*\/]+\/*)*)\*+\/
不确定为什么它没有显示在单独的一行中,但第二个示例由4行组成,第一行是/**行,然后是注释行,然后是注释标记的结束,其中可能也有回车符。也就是说,某些行可能以
\r\n
结尾,而不是您所期望的\n
。如果是这样,您可以通过将\r
添加到求反字符类来修复它,但效果更好。您可以本地化DOTALL标志的效果:/\*\*(?s:(?!\*\*\*/)*\*/
。但我不明白这有什么意义。这样做的唯一原因是如果您在正则表达式的其他地方有另一个*
,您担心会感谢您的帮助。这就是我最后所做的\/**([\r\n]|(*([^*/]|[\r\n]))\[^])***\/@JosephMaananaye好的,如果你觉得合适的话。我可以保证我建议的正则表达式在任何情况下都能工作,当然,除非注释块没有结束符。**/
。您是否在不匹配的字符串上测试了该正则表达式?因为这是一个教科书上的例子。试着从测试字符串中的一个多行注释中删除最后一个斜杠,你会明白我的意思。但是你能解释一下OP的问题是什么,以及你的正则表达式是如何解决的吗?无意冒犯,但“试试这个”和未经测试的正则表达式是一个非常低质量的答案。我知道它未经测试,因为它匹配从第一个/*
到最后一个*/
的所有内容。它的效率也非常低,而且很容易依赖较长的输入。
\/\*\/*((\**[^\*\/]+\/*)*)\*+\/