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, ...>>

关键是无论你有多少嵌套的通用参数,整个表达式中都只有一个“>”。

您可以使用 m.Gruops[1] 和 m.Groups[4] 来获取第一个和第二个类型。

于 2012-08-23T05:12:47.777 回答
0

两个逗号都在尖括号之间!解析复杂的嵌套语法时,正则表达式做得不好。问题应该是,如何找到一个逗号,它在尖括号之间,而尖括号本身不在尖括号之间。我不认为这可以用正则表达式来完成。

如果可能,请尝试使用反射。您还可以使用CS-Script来编译您的代码片段,然后使用反射来检索您需要的信息。

于 2012-08-22T19:38:15.223 回答
0

要拆分您给出的示例,您可以使用以下内容。但是,这不是通用的;它可以根据您期望的其他字符串进行通用化。根据您拥有的字符串的变化,此方法可能会变得复杂;但我建议在这里使用罗斯林是矫枉过正......

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 回答
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 回答