C# Regex найти группы, в которых отсутствует строка?

Во-первых, я ужасен с Regex. Приношу извинения, если это очень просто, и я просто скучаю по этому 🙁

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

Regex матч:

Private Function[sS]*?End Function

отлично работает.

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

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

Я использую regexstorm.net для моего тестирования, если это имеет значение 🙂 спасибо!

1 ответ

  1. Похоже, вы анализируете Visual Basic. Можно использовать средства анализа кода Microsoft (Roslyn) для разбора кода и анализа различных частей. Это предотвратит необходимость поиска различных синтаксических приемов различных файлов кода. Следующий пример кода определит, является ли a 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}");
    }