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)?>
  • 少なくとも 1 つのスペース <\s+>
  • オプションのキーワード static <(static)?>
  • 少なくとも 1 つのスペース <\s+>
  • Java 識別子 (クラス名またはリテラルであることが望まれます) <\w+>
  • 少なくとも 1 つのスペース <\s+>
  • Java 識別子 (関数名) <\w+>
  • 開き括弧 <(>
  • 任意の引数 (大量の混乱のため、ここではチェックは行われません) <.*?>
    • は遅延マッチングを行います
  • 閉じ括弧 <)>
  • 任意の空白 <\s*>
  • 行の終わり

これは完全にはほど遠いですが、ニーズに合うはずです。

于 2012-09-12T17:50:00.340 に答える
3

正規表現としてかなり複雑になる可能性があるため、どれだけ厳密にする必要があるかによって異なります。

Java でのメソッド宣言の文法は、次のようなものです。

Java メソッド宣言 BNF :

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

また、複数の修飾子があるが同じ修飾子が繰り返されていない、または複数のスコープ修飾子がないなどのことを確認する必要があります。また、タイプや識別子などの他のものは Java キーワードの 1 つではありません。毛むくじゃらになり始めます... あなたが独自の Java パーサーを書きたいとは思わないでしょう。

于 2012-09-12T16:44:19.577 に答える