Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在源代码中找到所有注释? 有两种风格的评论,C风格和C++风格,如何识别它们? /* comments */ // comments_Java_Comments - Fatal编程技术网

Java 如何在源代码中找到所有注释? 有两种风格的评论,C风格和C++风格,如何识别它们? /* comments */ // comments

Java 如何在源代码中找到所有注释? 有两种风格的评论,C风格和C++风格,如何识别它们? /* comments */ // comments,java,comments,Java,Comments,我可以随意使用任何方法和第三个库。您尝试过正则表达式吗?这是一个很好的Java示例总结。它可能需要一些调整,但是仅使用正则表达式对于更复杂的结构(嵌套注释、“字符串中的注释”)是不够的,但这是一个很好的开始。您尝试过正则表达式吗?这是一个很好的Java示例总结。它可能需要一些调整,但是仅使用正则表达式对于更复杂的结构(嵌套注释、“字符串中的注释”)是不够的,但这是一个很好的开始。编辑:我已经搜索了一段时间,但下面是real工作正则表达式: String regex = "((//[^\n\r]*

我可以随意使用任何方法和第三个库。

您尝试过正则表达式吗?这是一个很好的Java示例总结。它可能需要一些调整,但是仅使用正则表达式对于更复杂的结构(嵌套注释、“字符串中的注释”)是不够的,但这是一个很好的开始。

您尝试过正则表达式吗?这是一个很好的Java示例总结。它可能需要一些调整,但是仅使用正则表达式对于更复杂的结构(嵌套注释、“字符串中的注释”)是不够的,但这是一个很好的开始。

编辑:我已经搜索了一段时间,但下面是real工作正则表达式:

String regex = "((//[^\n\r]*)|(/\\*(.+?)\\*/))"; // New Regex
List<String> comments = new ArrayList<String>();

Pattern p = Pattern.compile(regex, Pattern.DOTALL);
Matcher m = p.matcher(code);
// code is the C-Style code, in which you want to serach
while (m.find())
{
    System.out.println(m.group(1));
    comments.add(m.group(1));
}
它生成以下输出:

//Comment one//
/* Blah */
line2(); // something weird
/* Multiline
another line for the comment
*/

请注意,输出的最后三行是一个单独的打印。

编辑:我已经搜索了一段时间,但这里是real工作正则表达式:

String regex = "((//[^\n\r]*)|(/\\*(.+?)\\*/))"; // New Regex
List<String> comments = new ArrayList<String>();

Pattern p = Pattern.compile(regex, Pattern.DOTALL);
Matcher m = p.matcher(code);
// code is the C-Style code, in which you want to serach
while (m.find())
{
    System.out.println(m.group(1));
    comments.add(m.group(1));
}
它生成以下输出:

//Comment one//
/* Blah */
line2(); // something weird
/* Multiline
another line for the comment
*/

请注意,输出的最后三行是一个单独的打印。

要可靠地查找Java源文件中的所有注释,我不会使用正则表达式,而是使用真正的lexer(又称标记器)

Java有两种流行的选择:

  • JFlex:
  • ANTLR:
与流行的观点相反,ANTLR也可以用于创建没有解析器的lexer

这里有一个快速的ANTLR演示。在同一目录中需要以下文件:

  • JavaCommentLexer.g(语法)
  • Main.java
  • java(带有外来注释的有效(!)java源文件)
JavaCommentLexer.g 主类 Test.java 您将看到以下内容被打印到控制台:


multilecomment::\u002f\u002a要可靠地查找Java源文件中的所有注释,我不会使用regex,而是使用真正的lexer(又称标记器)

Java有两种流行的选择:

  • JFlex:
  • ANTLR:
与流行的观点相反,ANTLR也可以用于创建没有解析器的lexer

这里有一个快速的ANTLR演示。在同一目录中需要以下文件:

  • JavaCommentLexer.g(语法)
  • Main.java
  • java(带有外来注释的有效(!)java源文件)
JavaCommentLexer.g 主类 Test.java 您将看到以下内容被打印到控制台:



multilecomment::\u002f\u002a您能说得更具体一点吗?找到这些评论后,您希望如何处理它们?“识别”它们是什么意思?以下是
.java
源文件中的有效注释:
\u002f\u002a多行注释\u002a/
。请注意
\u002f=='/'
\u002a=='*'
。你也要解释这些吗?里面只有有效的评论java@user705414,我给出的示例是Java内部的有效注释。@user705414,您的评论:“我并不真正关心unicode形式的注释”和“仅Java内部的有效注释”相互矛盾。如果您不关心角落的情况,那么“仅java内部的有效注释”是不正确的。您能更具体一点吗?找到这些评论后,您希望如何处理它们?“识别”它们是什么意思?以下是
.java
源文件中的有效注释:
\u002f\u002a多行注释\u002a/
。请注意
\u002f=='/'
\u002a=='*'
。你也要解释这些吗?里面只有有效的评论java@user705414,我给出的示例是Java内部的有效注释。@user705414,您的评论:“我并不真正关心unicode形式的注释”和“仅Java内部的有效注释”相互矛盾。如果你不关心这些极端情况,那么“java内部只有有效的注释”是不正确的。“一些”调整有点轻描淡写,依我看。看看最后一段(“注意事项”),看看它什么时候失败了。谢谢,我没有仔细阅读注意事项。更正了我的回答。“一些”调整有点轻描淡写,我想。看看最后一段(“注意事项”),看看它什么时候失败了。谢谢,我没有仔细阅读注意事项。更正了我的答案。这失败了,正如托马斯兹的建议。添加
String s=“foo/*bar”(字符串文字)甚至
\u002f\u002a多行注释\u002a/
(有效注释)。此外,不需要
模式。多行
,您可能希望在类
[^\n]
中包含
\r
(虽然大多数换行符以
\n
结尾…但是,旧的Mac文件可能只以
\r
结尾。)@Martjin,很好的解决方案。但是,line2();本身不是注释。如何删除它?呵呵,回顾这一点很有趣:regex并不意味着要在非正则语言上运行。除非我知道更多的理论,否则这就失败了,就像Tomasz的建议一样。添加
String s=“foo/*bar”
(字符串文字)甚至
\u002f\u002a多行注释\u002a/
(有效注释)在源代码中。此外,
模式。不需要多行
,您可能希望在类
[^\n]
中包含
\r
(虽然大多数换行符以
\n
结尾…但是,旧的Mac文件可能只以
\r
结尾)。@Martjin,很好的解决方案。但是,第2行();本身不是注释。如何删除它?呵呵,回顾这一点很有趣:正则表达式不适用于非正则语言。只有在我了解了一些理论之后,才有了漂亮的解决方案。但是,如果我不关心unicode和字符串中的注释字符等边缘大小写,我可以使用正则表达式吗?你不关心正则表达式吗我可以想象,这是Unicode文本。但我不理解忽略字符串文本中的内容。如果你想忘记所有这些,当然,继续使用正则表达式,但你是
import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    JavaCommentLexer lexer = new JavaCommentLexer(new ANTLRFileStream("Test.java"));
    CommonTokenStream tokens = new CommonTokenStream(lexer);
      for(Object o : tokens.getTokens()) {
      CommonToken t = (CommonToken)o;
      if(t.getType() == JavaCommentLexer.SingleLineComment) {
        System.out.println("SingleLineComment :: " + t.getText().replace("\n", "\\n"));
      }
      if(t.getType() == JavaCommentLexer.MultiLineComment) {
        System.out.println("MultiLineComment  :: " + t.getText().replace("\n", "\\n"));
      }
    }
  }
}
\u002f\u002a <- multi line comment start
multi
line
comment // not a single line comment
\u002A/
public class Test {

  // single line "not a string"

  String s = "\u005C" \242 not // a comment \\\" \u002f \u005C\u005C \u0022;
  /*
  regular multi line comment
  */
  char c = \u0027"'; // the " is not the start of a string

  char q1 = '\u005c'';                  // == '\''
  char q2 = '\u005c\u0027';             // == '\''
  char q3 = \u0027\u005c\u0027\u0027;   // == '\''
  char c4 = '\047';

  String t = "/*";
  \u002f\u002f another single line comment
  String u = "*/";
}
/* <- multi line comment start
multi
line
comment // not a single line comment
*/
public class Test2 {

  // single line "not a string"

  String s = "\" \242 not // a comment \\\" ";
  /*
  regular multi line comment
  */
  char c = '"'; // the " is not the start of a string

  char q1 = '\'';                  // == '\''
  char c4 = '\047';

  String t = "/*";
  // another single line comment
  String u = "*/";
}
import java.util.*;
import java.io.*;
import java.util.regex.*;

public class Main2 {

  private static String read(File file) throws IOException {
    StringBuilder b = new StringBuilder();
    Scanner scan = new Scanner(file);
    while(scan.hasNextLine()) {
      String line = scan.nextLine();
      b.append(line).append('\n');
    }
    return b.toString();
  }

  public static void main(String[] args) throws Exception {
    String contents = read(new File("Test2.java"));

    String slComment = "//[^\r\n]*";
    String mlComment = "/\\*[\\s\\S]*?\\*/";
    String strLit = "\"(?:\\\\.|[^\\\\\"\r\n])*\"";
    String chLit = "'(?:\\\\.|[^\\\\'\r\n])+'";
    String any = "[\\s\\S]";

    Pattern p = Pattern.compile(
        String.format("(%s)|(%s)|%s|%s|%s", slComment, mlComment, strLit, chLit, any)
    );

    Matcher m = p.matcher(contents);

    while(m.find()) {
      String hit = m.group();
      if(m.group(1) != null) {
        System.out.println("SingleLine :: " + hit.replace("\n", "\\n"));
      }
      if(m.group(2) != null) {
        System.out.println("MultiLine  :: " + hit.replace("\n", "\\n"));
      }
    }
  }
}