0

次のコードを含む.csファイルがあります

namespace Automate
{
    class Class1
    {
        public string GetString
        {
            get;
            set;
        }
        private bool flag1;
        private bool flag2;
        public void Method(bool param1)
        {
            bool flag = false;
        }
    }
    class Class2
    {
        private bool flag1;
        private bool flag2;
        public void Method(bool param1)
        {
            bool flag = false;
        }
    }
}

ここで、各メソッド名、プロパティ名、グローバル変数を関連付けられたクラス名と名前空間とともに返す正規表現が必要です。

誰かが私に可能な解決策やアイデアを教えてもらえますか?

前もって感謝します

4

3 に答える 3

0

この種の分析には正規表現を使用しないでください。堅牢なパーサーを構築することはできません(たとえば、完全修飾型名で結果を返すメソッド、ジェネリック型を返すジェネリックメソッドなど。ただし、もちろん、これはすべてタスクの詳細によって異なります)。

.NET 4.5で開発している場合は、Roslynを使用します。これはこの種の作業に最適なツールであり、比較的簡単に開始できます。別のアプローチは、単純なトークナイザーを作成し、それを使用してクラス構造を収集することです。

于 2013-03-14T08:54:10.710 に答える
0

わかりました。@volpavが書いているように、この種の正規表現の使用はお勧めしません...しかし、私はあなたの期待のいくつかに一致する正規表現を作成しました。しかし、これは私が急いでまとめたものであり、一致しないコードを書くことができる人がここにたくさんいることを非常に確信しています。私はあなたに出発点を与えることしかできません、そしてあなたはそこからそれを理解しなければなりません。(たとえば、これはアクセス修飾子のない関数とは一致しないため、整理する必要があります)

とにかくこれは私の提案です:

\s*(static)?\s*(public|private)\s*\w+\s*(\w+)\s*(\(\s*\w*(,?\s*\w+)*\))?

ただし、http: //gskinner.com/RegExr/のページを使用して正規表現を支援することをお勧めします。

幸運を

于 2013-03-14T09:53:00.840 に答える
0

実際、コンパイル時の前にソースコードから情報を抽出する必要がある場合があり(したがって、リフレクションがなくなります)、Roslynを使用できない場合があります。特に、ソースコードと一緒にコンパイルされるコードを生成するためにT4テンプレートの情報が必要な場合。

クラス名とプロパティ名およびタイプを名前付きキャプチャグループに抽出するために、VB.NET用に次のように記述しました(まだテストされていません)。

Static regexClassName As New Regex("(?<=^[^']*\bclass\s)(?<class>\b\w*)", RegexOptions.Compiled Or RegexOptions.CultureInvariant Or RegexOptions.IgnoreCase Or RegexOptions.Multiline)
Static regexProperty As New Regex("(?<=^[^']*\bproperty\s)(?<property>\b\w*)\s[Aa]s\s(?<type>\b\w*)", RegexOptions.Compiled Or RegexOptions.CultureInvariant Or RegexOptions.IgnoreCase Or RegexOptions.Multiline)

これらの正規表現は、コメントアウトされたコードと一致してはなりません。

(?<=^[^/]*\bclass\s)(?<class>\b\w*)C#に相当するものは、クラス名を取得するようになります。

于 2013-04-25T16:34:09.360 に答える