我有字符串
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 );
}
问题: 如何对未用尖括号封装的逗号进行正则表达式拆分?
答案 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]来获取第一个和第二个类型。