2016-05-01 16 views
0

Zunächst einmal, ich bin schrecklich mit Regex. Entschuldigung vorne, wenn das tot ist einfach und ich vermisse es einfach :(C# Regex Locate-Gruppen fehlen eine Zeichenfolge?

Ok, also sagen wir, ich bin auf der Suche nach meinem Quellcode zu analysieren, und finden Sie alle meine privaten Funktionen. Weiter, sagen wir, ich will dass ganze Code-Block zu bekommen, damit ich es untersuchen

Regex Match:..

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

große Werke

Nun, was ist, wenn ich alle Funktionen finden wollen, dass eine Rückkehr fehlen Ich kann mir das nicht vorstellen (siehe oben re: regex und ich nicht kommt gut miteinander aus).

Wer hat mir in die richtige Richtung gezeigt? Ich benutze .NET-Implementierung von Regex, wenn das wichtig ist (und es scheint - keines der Java-Beispiele, die ich finde, scheint zu funktionieren!)

Ich benutze regexstorm.net für meine Tests, wenn es darauf ankommt :) Vielen Dank!

+0

Warum benutzen Sie nicht einfach Ihre obige Regex, dann foreach Übereinstimmung, überprüfen Sie, ob die erfasste Zeichenkette 'return' enthält? Das wird ziemlich genau und ziemlich einfach sein. – Jonesopolis

Antwort

0

Es sieht so aus, als würden Sie Visual Basic analysieren. Sie können die Codeanalysewerkzeuge von Microsoft (Roslyn) verwenden, um den Code zu analysieren und die verschiedenen Teile zu analysieren. Dies wird verhindern, dass nach einer unterschiedlichen Syntaxakzeptanz verschiedener Codedateien gesucht werden muss. Der folgende Beispielcode bestimmt, ob Function privat ist oder eine as-Klausel hat.

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

Ok ... das .. ist verdammt cool, ich werde nicht lügen. Danke, ich hatte keine Ahnung, dass das überhaupt existiert !! – John

+0

Abhängig von Ihren Projektanforderungen können Sie den Code auch mit demselben Framework aktualisieren. – joncloud