正则表达式匹配方法内容

时间:2011-09-17 14:04:54

标签: c# regex

要开发Java Code Parser,我想将java源文件的方法内容提取为字符串。但问题是我无法通过获取{}之间的值来匹配Regex中的内容,因为某些方法在方法中有{}。像这样,

   public String[] getArgs() {

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

       }
     return args;
   }

如果我使用正则表达式

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

它仅捕获try{ //something

如何忽略方法中{}的出现,并获取方法中的值,如

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

   }
 return args;

2 个答案:

答案 0 :(得分: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}

答案 1 :(得分:0)

如果您的代码不必使用任意输入,则可以利用输入文件中的编码约定来查找方法。例如,在大多数编码指南中,方法总是从一个新行开始,而右括号与左括号具有相同的缩进。

如果您的代码必须使用任意输入,则正则表达式是错误的工具。你需要一个Java解析器。