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的问题是什么,以及你的正则表达式是如何解决的吗?无意冒犯,但“试试这个”和未经测试的正则表达式是一个非常低质量的答案。我知道它未经测试,因为它匹配从第一个
/*
到最后一个
*/
的所有内容。它的效率也非常低,而且很容易依赖较长的输入。
\/\*\/*((\**[^\*\/]+\/*)*)\*+\/