开发者

Regex to match method content

开发者 https://www.devze.com 2023-04-05 18:34 出处:网络
To develop a Java Code Parser, I want to extract method contents of a java source file as strings. But the problem is I can\'t 开发者_JAVA百科match the content from Regex by getting value between { an

To develop a Java Code Parser, I want to extract method contents of a java source file as strings. But the problem is I can't 开发者_JAVA百科match the content from Regex by getting value between { and } because some methods has { and } inside the method. Like this,

   public String[] getArgs() {

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

       }
     return args;
   }

If I use regex like

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

It only captures try{ //something

How can i ignore occurences of { and } inside method and get value inside method like

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

   }
 return args;


Try the following regex on C#-like text. It will capture every method body, taking nested {} into account. For explanations : 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);

[edit] Sorry, I forgot the "RegexOptions.IgnorePatternWhitespace"

This sample is writing to console :

{d{e}f}

{i}


If your code doesn't have to work with arbitrary input, you can take advantage of coding conventions in your input file to find the methods. For example, in most coding guidelines, methods always start on a new line, and the closing brace has the same indentation as the opening brace.

If your code has to work with arbitrary input, regexes are the wrong tool. You need a Java parser.

0

精彩评论

暂无评论...
验证码 换一张
取 消