2016-05-01 6 views
0

まずは、私はRegexと誇りを持っています。これは簡単に死んでいたら謝罪してしまいました。(C#Regexのロケートグループに文字列がありませんか?

私のソースコードを解析して私のプライベートな機能をすべて探しています。私はそれを調べることができ、コードのブロック全体を取得するための

正規表現のマッチ:。。

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

は素晴らしい作品今

、私はリターンが欠落しているすべての関数を検索したい場合はどのような私はこれを理解することはできません(上のre:regexを参照してください。有名に沿って)。

私は正しい方向に向いていますか?私はregexの.NET実装を使用しています(それは問題ないと思われます)。

私のテストではregexstorm.netを使用しています:)ありがとう!

+0

上記の正規表現を使用してforeach matchを使用しないでください。キャプチャした文字列に '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

関連する問題