2016-05-01 4 views
0

Во-первых, я УЖАСНЫЙ с Regex. Извинитесь, если это мертво легко, и я просто пропустил его :(C# Regex найти группы, отсутствующие в строке?

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

Regex матча:..

Private Function[\s\S]*?End Function 

прекрасно работает

Теперь, если я хочу, чтобы найти все функции, которые отсутствуют Возвращение заявление? Я не могу показаться, чтобы это вышло (см. выше re: regex, и я не хорошо ладить).

Любое сознание, указывающее на меня в правильном направлении? Я использую .NET-реализацию регулярного выражения, если это имеет значение (и, похоже, ни один из примеров Java, которые, как я считаю, не работают!)

Я использую regexstorm.net для тестирования, если это важно :) Благодаря!

+0

Почему вы не используете только указанное выше регулярное выражение, а затем встретите совпадение, проверьте, содержит ли захваченная строка 'return'? Это будет довольно точно и довольно легко. – Jonesopolis

ответ

0

Похоже, вы можете анализировать Visual Basic. Вы можете использовать инструменты анализа кода Microsoft (Roslyn) для анализа кода и анализа различных частей. Это предотвратит необходимость поиска различного синтаксического принятия различных файлов кода. Следующий пример кода определит, является ли Function частным или имеет предложение as.

string code = @" 
    Function MyFunction() 
    End Function 

    Private Function MyPrivateFunction() 
    End Function 

    Function WithAsClause() As Integer 
    End Function 
    "; 

// Parse the code file. 
var tree = VisualBasicSyntaxTree.ParseText(code); 

var root = tree.GetCompilationUnitRoot(); 

// Find all functions in the code file. 
var nodes = root.DescendantNodes() 
    .Where(n => n.Kind() == SyntaxKind.FunctionBlock) 
    .Cast<MethodBlockSyntax>(); 

foreach (var node in nodes) 
{ 
    // Analyze the data for the function. 
    var functionName = node.SubOrFunctionStatement.Identifier.GetIdentifierText(); 
    bool isPrivate = node.BlockStatement.Modifiers.Any(m => m.Kind() == SyntaxKind.PrivateKeyword); 
    var asClause = node.SubOrFunctionStatement.AsClause; 
    bool hasAsClause = asClause != null; 

    Console.WriteLine($"{functionName}\t{isPrivate}\t{hasAsClause}"); 
} 
+0

Хорошо ... это .. круто круто, я не буду лгать. Спасибо, я понятия не имел, что это даже существовало !! – John

+0

В зависимости от ваших требований к проекту вы также можете автоматизировать обновление кода с помощью той же структуры. – joncloud

Смежные вопросы