2011-09-17 12 views
5

Aby utworzyć analizator składni kodu Java, chcę wyodrębnić zawartość metody pliku źródłowego java jako łańcuchy. Ale problem polega na tym, że nie mogę dopasować zawartości z Regex przez uzyskanie wartości między { i }, ponieważ niektóre metody mają wewnątrz metody { i }. Tak,Regex do dopasowania zawartości metody

public String[] getArgs() { 

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

     } 
    return args; 
    } 

Jeśli używam regex jak

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

Przechwytuje tylko try{ //something

Jak mogę ignorować wystąpień { i } wewnątrz metody i uzyskać wartość wewnątrz metody jak

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

    } 
return args; 
+0

możliwy duplikat [źródła Java Java e parser] (http://stackoverflow.com/questions/4273284/java-source-code-parser) –

+0

@Austin: - Duplikat, do którego się odwołujesz, prosi o parser lub bibliotekę. Ale to, co chcę, to kod – Nipuna

Odpowiedz

2

Wypróbuj następujące wyrażenie regularne na tekst podobny do C#. Przechwyci każdą treść metody, biorąc pod uwagę zagnieżdżony {}. Objaśnienia: 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); 

[Edycja] Niestety, to zapomniał "RegexOptions.IgnorePatternWhitespace"

tym przykładzie jest pisanie na konsoli:

{{d e} f}

{i}

+0

Aby to działało, najpierw trzeba było usunąć klasę {}. Po pracy. Tnx. – Nipuna

0

Jeśli Twój kod nie zawiera e do pracy z dowolnymi danymi wejściowymi, możesz skorzystać z konwencji kodowania w pliku wejściowym, aby znaleźć metody. Na przykład w większości wytycznych dotyczących kodowania metody zawsze zaczynają się od nowej linii, a nawias zamykający ma takie samo wcięcie jak nawias otwierający.

Jeśli twój kod musi działać z dowolnymi danymi wejściowymi, wyrażenia regularne są niewłaściwym narzędziem. Potrzebujesz parsera Java.

+0

Właściwie ten kod jest dla parsera Java :) – Nipuna

Powiązane problemy