查找Java函数的开始和结束

查找Java函数的开始和结束,java,metaprogramming,syntax-highlighting,Java,Metaprogramming,Syntax Highlighting,在Java中,如果源代码是字符串,并且是大括号的开头,是否可以为Java源代码的示例生成相应的大括号 public class FindFunctionStartAndEnd{ public static Object findCorrespondingCurlyBrace(String sourceCode, string startingPosition){ //return the string position that corresponds to the ma

在Java中,如果源代码是字符串,并且是大括号的开头,是否可以为Java源代码的示例生成相应的大括号

public class FindFunctionStartAndEnd{
    public static Object findCorrespondingCurlyBrace(String sourceCode, string startingPosition){
        //return the string position that corresponds to the matching curly brace
        //the input string should be the source code of a Java class
        //if sourceCode is not valid Java code, return false
    }
}

您需要遍历字符串,从起始位置开始计算开括号和闭括号,并将它们匹配起来。问题是,有几种情况下您需要忽略它们(这里只是几个示例):

  • 在行注释中(在
    /
    和“新行”之间)
  • 在块注释中(介于
    /*
    (不被行注释隐藏)和
    */
    之间)
  • 字符串中
    文本(在两个匹配的
    ”之间(忽略转义(
    \”
    ,但注意
    \\”
    \\”
    !)
  • char
    文本中(在两个匹配的
    '
    之间)
  • 可能更多
您可以在运行字符串时保留所有这些的计数器,也可以生成一个正则表达式,该正则表达式将匹配整个函数体(包括列表中的所有这些情况),然后应用它一次,并查看在找到函数体后匹配索引的最终位置


在任何情况下,任何一个都应该有一点参与,以确保正确操作,因此我建议您访问Google,看看是否可以找到一些预制正则表达式的示例。

许多Java IDE(如Eclipse)在光标位于其中一个大括号之前时会高亮显示相应的大括号。我很好奇大多数IDE是如何实现此功能的。@OliCharlesworth哪个解析器可以用于此目的,以及“他们”是谁?为了正确匹配花括号,我需要找到一种方法来处理字符串文本中的花括号,如本例中所示:public static void printStuff(){System.out.println(“这个方法可能很难解析。}”)}这是一个更复杂的问题:@AndersonGreen为什么不研究一下Eclipse的源代码?(尽管我相信代码不容易阅读。)我想知道是否有任何现有的Java解析器可以使这项任务变得更容易。我几乎可以肯定,有-许多Java IDE以前都实现过这项功能。:/@AndersonGreen从上面评论中的链接看,Antlr似乎能够做到这一点。我不确定性能是否会成为您关注的问题,但最快的解决方案可能会出现可以是专门针对这种情况的正则表达式(而不是成熟的语法分析器)或者您自己的计数方法。任何通用Java解析器都可能会增加大量不必要的开销。计数方法甚至可能不会太难开始使用。只需构建第一个版本,并在遇到越来越多的异常时不断扩展其逻辑(如转义的
的内部字符串,在查找字符串结尾时需要忽略(
“…\”
)。但不确定您是否只想自己使用它,并且这种调试方法还可以,或者是否需要为生产做好准备。我认为计数更好,因为OP不需要构建完整的语法树。您无法通过应用单个大正则表达式来解决这一问题。