正则表达式,以匹配任何合法java函数声明的格式

正则表达式,以匹配任何合法java函数声明的格式,java,regex,Java,Regex,正则表达式是我的一个弱点 我正在寻找一种正则表达式或其他技术,它允许我读取任意字符串并确定它是否是有效的java函数 好: 坏的: 代码: For String line : lines. { If(line.matches("(public|protected|private)*(/w)*(") } 是否存在这样一个正则表达式,如果它是有效的java函数,它将返回true?取决于您需要它的严格程度,因为它可能会变得相当复杂 Java中方法声明的语法如下所示: : 您必须检查

正则表达式是我的一个弱点

我正在寻找一种正则表达式或其他技术,它允许我读取任意字符串并确定它是否是有效的java函数

好:

坏的:

代码:

For String line : lines.
{    
     If(line.matches("(public|protected|private)*(/w)*(")
}

是否存在这样一个正则表达式,如果它是有效的java函数,它将返回true?

取决于您需要它的严格程度,因为它可能会变得相当复杂

Java中方法声明的语法如下所示:

:

您必须检查多个修饰符,但不重复同一个修饰符或多个作用域修饰符,以及类型和标识符不是Java关键字之一。开始变得毛茸茸的。。。我怀疑您是否想编写自己的Java解析器

/^\s*(public|private|protected)?\s+(static)?\s+\w+\s+\w+\s*\(.*?\)\s*$/m
匹配项:

  • 起跑线
  • 任意空白
  • 可选范围
  • 至少有一个空间
  • 可选关键字static
  • 至少有一个空间
  • java标识符(您应该希望它是类名或文本)
  • 至少有一个空间
  • java标识符(函数名)
  • 开放式paren
  • 武断的争论(这里没有检查,因为混乱不堪)
    • 不进行惰性匹配
  • 关闭paren
  • 任意空格
  • 行尾

这还远未完成,但应该适合您的需要。

您能找一个;在队伍的尽头?你可能还得看看它周围的一排,我现在正在打电话,所以我面前没有消息来源。我将尝试用上面提到的更新方法从内存中调用“任何有效java函数”的一般情况,这很可能无法用regexp完成,因为它需要正确的解析器。您是否对需要识别的内容有任何限制?您是否需要能够检测具有泛型参数或返回类型的方法?如果是这样,您将无法使用正则表达式,因为正则表达式不能用于描述上下文无关语法,这是描述泛型所必需的(也就是说,类型的泛型参数本身可能是泛型类型等等)(
public
private
protected
)然后再使用
static
指示符。当然,您可以用另一种方式对它们进行编码。BNF会导致这样的结果:
/^\s*((public | private | protected | static | final | native | synchronized | abstract | threadsafe | transient)\s+)*)\s*)\s*)\s*)\s*\(([^]*)\)[\w\s,]*?(\{)?\s*?$/gm
它也不检查语义,它只检查语法。
For String line : lines.
{    
     If(line.matches("(public|protected|private)*(/w)*(")
}
method_declaration 
    ::= 
    { modifier } type identifier 
    "(" [ parameter_list ] ")" { "[" "]" } 
    ( statement_block | ";" ) 
/^\s*(public|private|protected)?\s+(static)?\s+\w+\s+\w+\s*\(.*?\)\s*$/m