3

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

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

好的:

public void foo()
void foo()
static protected List foo()
static List foo()

坏的:

public List myList = new List()

代码:

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

如果它是有效的java函数,是否有这样的正则表达式会返回true?

4

2 回答 2

6
/^\s*(public|private|protected)?\s+(static)?\s+\w+\s+\w+\s*\(.*?\)\s*$/m

火柴:

  • 行首 <^>
  • 任意空格 <\s*>
  • 可选范围 <(public|private|protected)?>
  • 至少一个空格 <\s+>
  • 可选关键字 static <(static)?>
  • 至少一个空格 <\s+>
  • 一个 java 标识符(你应该希望它是一个类名或文字)<\w+>
  • 至少一个空格 <\s+>
  • 一个 java 标识符(函数名)<\w+>
  • 打开括号 <(>
  • 任意参数(这里没有检查,因为大量的混乱)<.*?>
    • 做惰性匹配
  • 关闭括号 <)>
  • 任意空格 <\s*>
  • 行结束

这远未完成,但应该满足您的需求。

于 2012-09-12T17:50:00.340 回答
3

取决于您需要它有多严格,因为它作为正则表达式可能会变得相当复杂。

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

Java 方法声明 BNF

method_declaration 
    ::= 
    { modifier } type identifier 
    "(" [ parameter_list ] ")" { "[" "]" } 
    ( statement_block | ";" ) 

并且您必须检查诸如具有多个修饰符但不是重复的相同修饰符或多个范围修饰符之类的事情,以及类型和标识符之类的其他事情不是Java关键字之一。开始变得毛茸茸...我怀疑您是否想编写自己的 Java 解析器。

于 2012-09-12T16:44:19.577 回答