如何使用正则表达式仅分割逗号而不是尖括号?

时间:2012-08-22 19:13:47

标签: c# regex

我有字符串 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 个答案:

答案 0 :(得分:0)

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

如果可能,尝试使用Reflection。您也可以使用CS-Script编译代码段,然后使用Reflection来检索所需的信息。

答案 1 :(得分: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);

我希望这会有所帮助。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

这是我将使用的正则表达式:

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

([\w\.]+)匹配&#34; DoubleGeneric&#34;。 (\<.+\>)?匹配可能的通用参数,例如DoubleGeneric <OtherGeneric<int, ...>>

关键是,无论你拥有多少嵌套通用算法,你只有一个&#34;&gt;,&#34;在整个表达中。

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