Предполагая, что это всего лишь разовая вещь, и ваш источник "сбалансирован" (равное количество {
и }
в ваших исходных файлах), вы можете использовать для него балансировку Regex.
Этот фрагмент просто берет файл и проверяет внутри него любые .. class .. { .. }
и возвращает их как String[]
.
Вам нужно изменить его, чтобы он совпадал с AcceptVerbs(HttpVerbs.Post)
в запросе linq в конце. Повторно просматривая ваш каталог и делая это для каждого файла .cs, я полагаю, у вас есть код для. наконец, вам также может понадобиться немного изменить его и использовать rx больше / меньше раз, в зависимости от уровня {}
, в который вы хотите начать поиск.
Этот тестовый фрагмент был создан в LinqPad . Вы можете загрузить его и проверить его, установив для Language значение C# Program
, однако перемещение его в консольное приложение, которое печатает в файл или аналогичный файл, должно быть простым.
void Main()
{
String data = String.Empty;
using (StreamReader reader = new StreamReader(@"/path/to/a/file.cs"))
data = reader.ReadToEnd();
CheckContents(data, "class").Dump();
}
// Define other methods and classes here
String[] CheckContents(String data, String pattern)
{
var rx = new Regex(@"{
(?>
{ (?<DEPTH> )
|
} (?<-DEPTH> )
|
[^}{]*
)*
(?(DEPTH)(?!))
}", RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline);
var rx2 = new Regex(@"[^{]*{
(?>
{ (?<DEPTH> )
|
} (?<-DEPTH> )
|
[^}{]*
)*
(?(DEPTH)(?!))
}", RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline);
var nameSpace = rx.Match(data).Value.Substring(1); // Remove { from namespace so we don't match the same thing over and over
var parts = rx2.Matches(nameSpace);
return (from Match part in parts where Regex.IsMatch(part.Value, pattern) select part.Value.Trim()).ToArray();
}