使用Regex解析代码-如何使用额外的{...}捕获方法的主体? [英] Parse code with Regex - how to capture method's body with extra {... }?

查看:92
本文介绍了使用Regex解析代码-如何使用额外的{...}捕获方法的主体?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


可能重复:

使用Regex解析CIL代码

此问题来自< a href = https://stackoverflow.com/questions/12999422/parse-cil-code-with-regex>使用Regex解析CIL代码
为了捕获方法的主体,我添加了方括号(),它变成

var regex3 = @(\.method\s [^ {] +({(?! \s *})。*?})));

,效果很好。例如, capture.Groups [2] 给我

and it worked fine. For example, capture.Groups[2] gives me

{
    .entrypoint
    // 
    .maxstack  8
    IL_0000:  nop
    IL_0001:  call       void TestAssemblyConsole.Test::Method1()
    IL_0006:  nop
    IL_0007:  call       int32 TestAssemblyConsole.Test::Method2()
    IL_000c:  pop
    IL_000d:  call       string [mscorlib]System.Console::ReadLine()
    IL_0012:  pop
    IL_0013:  ret
  }

这就是我想要的。但是,如果我有

and it's what I'm looking for. However if I have

.method public hidebysig static void  Method1() cil managed
  {
    // 
    .maxstack 3
    .locals init (class [mscorlib]System.Exception V_0)
    IL_0000:  nop
    .try
    {
      .try
      {
        IL_0001:  nop
        IL_0002:  ldstr      "gfhgfhgfhg"
        IL_0007:  call       void [mscorlib]System.Console::WriteLine(string)
        IL_000c:  nop
        IL_000d:  nop
        IL_000e:  leave.s    IL_0020

      }  // end .try
      catch [mscorlib]System.Exception 
      {
        IL_0010:  stloc.0
        IL_0011:  nop
        IL_0012:  ldstr      "exception"
        IL_0017:  call       void [mscorlib]System.Console::WriteLine(string)
        IL_001c:  nop
        IL_001d:  nop
        IL_001e:  leave.s    IL_0020

      }  // end handler
      IL_0020:  nop
      IL_0021:  leave.s    IL_0031

    }  // end .try
    finally
    {
      IL_0023:  nop
      IL_0024:  ldstr      "finally"
      IL_002f:  nop
      IL_0030:  endfinally
    }  // end handler
    IL_0031:  nop
    IL_0032:  ret
  } 

然后它无法正常工作。我只是因为方法中的} ..} 而捕获了方法主体的 部分

then it does not working well. I just captures the part of method's body because of } .. } within a method

{
    // 
    .maxstack  1
    .locals init (class [mscorlib]System.Exception V_0)
    IL_0000:  nop
    .try
    {
      .try
      {
        IL_0001:  nop
        IL_0002:  ldstr      "gfhgfhgfhg"
        IL_0007:  call       void [mscorlib]System.Console::WriteLine(string)
        IL_000c:  nop
        IL_000d:  nop
        IL_000e:  leave.s    IL_0020

      }

即使包含许多{..},我如何更改正则表达式以捕获所有方法的主体?

How do I change regex to be able to capture all method's body even when it contains many { .. } ?

推荐答案

基本来说,正则表达式不是匹配嵌套结构的正确工具,但是在您的情况下,您可以使用{。*}之类的东西来匹配所有内容,直到最后一个} (显然,这无法使用多种方法。)

Basically Regexes are not the right tool for matching nested structures, however in your case you could use something like {.*} to match everything until the last } (Obviously that won't work with multiple methods.)

编写CF语法解析器可以自己使用,也可以使用Antlr之类的东西。

Write a CF Grammar parser yourself or use something like Antlr.

这篇关于使用Regex解析代码-如何使用额外的{...}捕获方法的主体?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆