2009-06-25 37 views
1

这应该是一个非常简单的问题,但我似乎无法找到正确的解决方案。在格式中有一个字符串:C#如何使用正则表达式分割(A:B = C)*?

A:B=C;D:E=F;G:E=H;... 

而A,B和C是字母数字(并且可能会更低,也可能是大写)。 A和B的长度为1+,C可能为空。

我想我必须沿着

((?<A>.+):(?<B>.+)=(?<C>.*);)* 

线使用的东西,但我不知道如何使它在一个懒惰的方式相匹配。我也不知道如何获得各自比赛的结果,所以我会很感激一些代码示例。

如果你能给我一个提示,我会很高兴。

+0

(编辑做出更加明确,并指出需要代码) – mafu 2009-06-25 07:46:58

回答

4

您可以使用\w来匹配字母数字字符,而不是匹配所有内容的.。然后,你可以尝试在同一时间捕捉到一个匹配:

(?<A>\w+):(?<B>\w+)=(?<C>\w*); 

这里有一个小例子:

Regex regex = new Regex("(?<A>\\w+):(?<B>\\w+)=(?<C>\\w*);"); 
string test = "A:B=C;D:E=F;G:E=H"; 

// get all matches 
MatchCollection mc = regex.Matches(test); 

foreach (Match m in mc) { 
    Console.WriteLine("A = {0}", m.Groups["A"].Value); 
    Console.WriteLine("B = {0}", m.Groups["B"].Value); 
    Console.WriteLine("C = {0}", m.Groups["C"].Value); 
} 

:有几个工具可以让你用正则表达式,并进行实验提供某种帮助;我个人喜欢Expresso - 试一试,这对学习非常有用。

+0

感谢您的链接,我会看看! – mafu 2009-06-25 07:55:56

2
Regex r = new Regex("(?<A>\\w)+:(?<B>\\w)+=(?<C>\\w)*;"); 

\ w将匹配字母数字和下划线,相当于[a-zA-Z0-9_]。

反斜杠在字符串中被转义,所以它变成了\ \ w。

正则表达式捕获组A,B和C,并将匹配0个或多个C或由分号分隔的整个组的元素。

您将有多个Match对象:

MatchCollection m = r.Matches(sampleInput); 
// m[0] will contain A:B=C; 
// m[1] will contain D:E=F; 
// m[2] will contain G:E=H; 
// ... 
5

是正则表达式的要求?由于该字符串有一个很有条理,好,结构,很容易解析它没有正则表达式:

string input = "A:B=C;D:EF=G;E:H=;I:JK=L"; 
string[] elements = input.Split(new[] { ';' }); 
List<string[]> parts = new List<string[]>(); 
foreach (string element in elements) 
{ 
    parts.Add(element.Split(new[] { ':', '=' })); 
} 
// result output 
foreach (string[] list in parts) 
{ 
    Console.WriteLine("{0}:{1}={2}", list[0], list[1], list[2]); 
} 

输出将是:

A:B=C 
D:EF=G 
E:H= 
I:JK=L 
+0

为什么所有的分割和混乱的列表,当一个单行与正则表达式会给你一个Match对象的集合,已经标记为组? – 2009-06-25 07:52:48