2011-09-17 23 views
5

要開發Java代碼解析器,我想將java源文件的方法內容作爲字符串提取。但問題是我無法匹配正則表達式中的內容,因爲在方法內有一些方法有{},因此在{}之間取值。與此類似,用於匹配方法內容的正則表達式

public String[] getArgs() { 

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

     } 
    return args; 
    } 

如果我使用正則表達式像

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

它只能捕獲try{ //something

我怎麼能忽略的{}內部方法出現次數和進去方法值一樣

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

    } 
return args; 
+0

[Java source cod e解析器](http://stackoverflow.com/questions/4273284/java-source-code-parser) –

+0

@奧斯汀: - 您所指的重複請求解析器或庫。但我想要的是代碼 – 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

爲了這個工作,它首先需要刪除class {}。它工作後。 TNX。 – Nipuna

0

如果你的代碼沒有hav e可以使用任意輸入,您可以利用輸入文件中的編碼約定來查找方法。例如,在大多數編碼指南中,方法總是以新行開始,並且右大括號與大括號具有相同的縮進。

如果您的代碼必須使用任意輸入,則正則表達式是錯誤的工具。你需要一個Java解析器。

+0

實際上這個代碼是爲Java解析器:) – Nipuna