0

私は文字列を持っています DobuleGeneric<DoubleGeneric<int,string>,string>

私は2つの型の引数を取得しようとしています: DoubleGeneric<int,string>そしてstring

当初、私は'、'で分割を使用していました。これは機能しましたが、一般的な引数がテーマ自体が一般的でない場合に限ります。

私のコード:

string fullName = "DobuleGeneric<DoubleGeneric<int,string>,string>";
Regex regex = new Regex( @"([a-zA-Z\._]+)\<(.+)\>$" );
Match m = regex.Match( fullName );
string frontName = m.Groups[1].Value;
string[] innerTypes = m.Groups[2].Value.Split( ',' );

foreach( string strInnerType in innerTypes ) {
        Console.WriteLine( strInnerType );
}

質問: 山かっこで囲まれていないコンマで正規表現を分割するにはどうすればよいですか?

4

4 に答える 4

0

これが私が使用する正規表現です:

\<(([\w\.]+)(\<.+\>)?)\,(([\w\.]+)(\<.+\>)?)$

([\w\.]+)「DoubleGeneric」に一致します。 (\<.+\>)?DoubleGenericのような可能な一般的な引数に一致します<OtherGeneric<int, ...>>

重要な点は、ネストされた汎用引数がいくつあっても、式全体で「>、」が1つしかないということです。

m.Gruops[1]とm.Groups[4]を使用して、最初と2番目のタイプを取得できます。

于 2012-08-23T05:12:47.777 に答える
0

答えは正しいです。正規表現を使用するのは間違ったアプローチです。

最終的に線形パスを実行し、角かっこで囲まれたアイテムを~sに置き換えてから、分割を実行しました。

static void Main( string[] args ) {

    string fullName = "Outer<blah<int,string>,int,blah<int,int>>";          

    Regex regex = new Regex( @"([a-zA-Z\._]+)\<(.+)\>$" );
    Match m = regex.Match( fullName );
    string frontName = m.Groups[1].Value;
    string inner = m.Groups[2].Value;

    var genArgs = ParseInnerGenericArgs( inner );

    foreach( string s in genArgs ) {
        Console.WriteLine(s);
    }
    Console.ReadKey();
}

private static IEnumerable<string> ParseInnerGenericArgs( string inner ) {
    List<string> pieces = new List<string>();
    int angleCount = 0;
    StringBuilder sb = new StringBuilder();
    for( int i = 0; i < inner.Length; i++ ) {
        string currChar = inner[i].ToString();
        if( currChar == ">" ) {
            angleCount--;
        }
        if( currChar == "<" ) {
            angleCount++;
        }
        if( currChar == ","  &&  angleCount > 0 ) {

            sb.Append( "~" );

        } else {
            sb.Append( currChar );
        }

    }
    foreach( string item in sb.ToString().Split( ',' ) ) {
        pieces.Add(item.Replace('~',','));
    }
    return pieces;
}
于 2012-08-22T20:15:13.553 に答える
0

両方のコンマは山括弧の間にあります!複雑なネストされた構文を解析するとき、正規表現は悪い仕事をします。問題は、それ自体が山括弧の間にない山括弧の間にあるコンマをどのように見つけるかということです。これは正規表現ではできないと思います。

可能であれば、Reflectionを使用してみてください。CS-Scriptを使用してコードスニペットをコンパイルしてから、Reflectionを使用して必要な情報を取得することもできます。

于 2012-08-22T19:38:15.223 に答える
0

あなたが与えた例を分割するために、あなたは以下を使うことができます。ただし、これは一般的なものではありません。期待する他の文字列に基づいて汎用にすることができます。使用している文字列のバリエーションによっては、このメソッドは複雑になる可能性があります。しかし、ここでのRoslynの使用はやり過ぎだと思います...

string fullName = "DobuleGeneric<DoubleGeneric<int,string>,string>"; 
Regex Reg = 
    new Regex(@"(?i)<\s*\p{L}+\s*<\s*\p{L}+\s*,\s*\p{L}+\s*>\s*,\s*\p{L}+\s*>");
Match m = Reg.Match(fullName);
string str = m.ToString().Trim(new char[] { '<', '>' });
Regex rr = new Regex(@"(?i),(?!.*>\s*)");
string[] strArr = rr.Split(str);

これがお役に立てば幸いです。

于 2012-08-22T19:46:19.590 に答える