2011-09-17 19 views
5

Javaコードパーサーを開発するには、javaソースファイルのメソッドの内容を文字列として抽出します。しかし、問題は、方法の中に{}があるため、{}の間の値を取得することによってRegexのコンテンツを一致させることができないということです。私は正規表現のメソッドの内容と一致させる

Regex regex = new Regex("(?<={).*?(?=})"); 

のような正規表現を使用している場合はこのように、

public String[] getArgs() { 

     try{ 
      //something 
     } 
     catch(Exception e){ 

     } 
    return args; 
    } 

それだけtry{ //something

どのように私は、メソッドの内部{}の出現箇所を無視して

のようにメソッド内で値を得ることができますをキャプチャ
try{ 
     //something 
    } 
    catch(Exception e){ 

    } 
return args; 
+0

[Javaソースコードeパーサー](http://stackoverflow.com/questions/4273284/java-source-code-parser) –

+0

@Austin: - あなたがパーサまたはライブラリを要求するために参照している複製。しかし、私が欲しいのはコード – Nipuna

答えて

2

C#のようなテキストで次の正規表現を試してください。 ネストされた{}を考慮して、すべてのメソッド本体を取得します。説明のため :http://www.codeproject.com/KB/recipes/Nested_RegEx_explained.aspx

var reg = @" 
(?<body> 
\{(?<DEPTH>) 
(?> 
(?<DEPTH>)\{ 
    | 
\}(?<-DEPTH>) 
    | 
(?(DEPTH)[^\{\}]* |) 
)* 
\}(?<-DEPTH>) 
(?(DEPTH)(?!)) 
)"; 
     var input = "abc{d{e}f}gh{i}"; 
     foreach (Match m in Regex.Matches(input,reg, RegexOptions.IgnorePatternWhitespace)) Console.WriteLine(m.Groups["body"].Value); 

[編集] 申し訳ございませんが、私が "RegexOptions.IgnorePatternWhitespace"

このサンプルは、コンソールへの書き込みが行われているのを忘れ:

{D {E}をF}

{i}

+0

これが機能するには、最初にクラス{}を削除する必要がありました。それが働いた後。 Tnx。 – Nipuna

0

コードに問題がない場合任意の入力を処理するには、入力ファイルのコーディング規約を利用してメソッドを見つけることができます。たとえば、ほとんどのコーディングガイドラインでは、メソッドは常に新しい行で開始し、閉じ中括弧は開始中括弧と同じインデントを持ちます。

コードが任意の入力で動作する必要がある場合、正規表現は間違ったツールです。 Javaパーサが必要です。

+0

実際にはこのコードはJava Parser用です:) – Nipuna

関連する問題