Разобрать код CIL с помощью Regex

У меня есть файл *.il. Я хочу найти в нем все непустые методы (.method). Например:

.class private auto ansi beforefieldinit MyApp.Program
       extends [mscorlib]System.Object
{
   //catch its body
  .method private hidebysig static void  Main(string[] args) cil managed
  {
    .entrypoint
    // 
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ret
  }  

  //catch its body
  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    // 
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0006:  ret
  }  

   //don't touch, it's empty
   .method public hidebysig newslot virtual 
          instance string  Invoke(string a) runtime managed
  {
  }  
 //......................................
}

Теперь я делаю это, используя строку класса. Это довольно нерационально. Я пытался использовать Regex, но не мог понять, как создать регулярное выражение, чтобы поймать только

  • методы (а не классы)
  • только методы с непустым телом

Кто-нибудь может мне помочь?


person Alan Coromano    schedule 21.10.2012    source источник
comment
анализ CIL-кода с помощью регулярных выражений может очень быстро усложниться. Как насчет использования чего-то Mono.Cecil, где тестирование пустого тела метода так же просто, как написать method.HasBody?   -  person Jb Evain    schedule 21.10.2012


Ответы (1)


Использование регулярных выражений для разбора кода структуры не рекомендуется и является плохой практикой.

Попробуйте использовать шаблон регулярного выражения

(\.method\s[^{]+?)(?=\s*{)(?!\s*{\s*})

Протестируйте здесь.

Чтобы поймать также тело {...} каждого метода, используйте шаблон регулярного выражения

(\.method\s[^{]+{(?!\s*}).*?})

Протестируйте здесь.


Чтобы узнать больше о регулярных выражениях, посетите regular-expressions.info.

person Ωmega    schedule 21.10.2012
comment
@AlanDert - Ответ обновлен :: см. ссылку Протестировать здесь - person Ωmega; 21.10.2012
comment
Большое спасибо, это работает. Однако почему вы используете тестер регулярных выражений JavaScript, это то же самое, что и C#? И извините, я забыл спросить, как мне изменить поиск всех тела (между { ... }) этих методов (не пустых)? И, пожалуйста, объясните, что означает каждая часть этого регулярного выражения? - person Alan Coromano; 21.10.2012
comment
@AlanDert - ответ был обновлен решением, которое также улавливает тело метода. В качестве тестовой ссылки я использовал тестер JavaScript, так как я не знаю ни одного бесплатного онлайн-тестера регулярных выражений С#. Если вы это сделаете, я буду рад использовать его, просто дайте мне знать... - person Ωmega; 21.10.2012
comment
@AlanDert - Вы использовали флаг RegexOptions.Singleline? - person Ωmega; 21.10.2012
comment
Последний вопрос. Подскажите, пожалуйста, как поймать только тела (между { ... }) непустых методов? - person Alan Coromano; 22.10.2012
comment
-1: вы не можете использовать для этого регулярные выражения, и, дав этот ответ, вы побудили его задать другой вопрос о том, как справиться с очевидной сложностью вложенных структур. - person Ken Bloom; 22.10.2012
comment
Омега, взгляните на этот stackoverflow.com/questions/13004518/ - person Alan Coromano; 22.10.2012