2011-09-17 17 views
5

Per sviluppare un parser del codice Java, desidero estrarre i contenuti del metodo di un file di origine Java come stringhe. Ma il problema è che non posso abbinare il contenuto di Regex ottenendo valore tra { e } perché alcuni metodi hanno { e } all'interno del metodo. In questo modo,Regex per abbinare il contenuto del metodo

public String[] getArgs() { 

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

     } 
    return args; 
    } 

se uso regex come

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

Cattura solo try{ //something

Come posso ignorare le occorrenze di { e } metodo all'interno e ottenere il valore metodo all'interno come

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

    } 
return args; 
+0

possibile duplicato di [codice sorgente Java cod e parser] (http://stackoverflow.com/questions/4273284/java-source-code-parser) –

+0

@Austin: - Il duplicato a cui ti stai riferendo chiede un parser o una libreria. Ma quello che voglio è il codice – Nipuna

risposta

2

Provare la seguente espressione regolare sul testo di tipo C#. Catturerà ogni corpo del metodo, tenendo conto di nested {}. Per spiegazioni: 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); 

[modifica] Scusa, ho dimenticato il "RegexOptions.IgnorePatternWhitespace"

Questo esempio sta scrivendo per consolare:

{d} {e f}

{i}

+0

Per farlo funzionare, prima era necessario rimuovere la classe {}. Dopo che ha funzionato. Tnx. – Nipuna

0

Se il tuo codice non ha Per lavorare con input arbitrari, puoi sfruttare le convenzioni di codifica nel tuo file di input per trovare i metodi. Ad esempio, nella maggior parte delle linee guida sulla codifica, i metodi iniziano sempre su una nuova riga e la parentesi di chiusura ha lo stesso rientro della parentesi aperta.

Se il codice deve funzionare con input arbitrario, le regex sono lo strumento sbagliato. Hai bisogno di un parser Java.

+0

In realtà questo codice è per un parser Java :) – Nipuna

Problemi correlati