这应该是一个非常简单的问题,但我似乎无法找到正确的解决方案。格式为字符串:
A:B=C;D:E=F;G:E=H;...
而A,B和C是字母数字(并且可以是较低的以及大写的)。 A和B的长度为1+,C可能为空。
我认为我必须使用
的内容((?<A>.+):(?<B>.+)=(?<C>.*);)*
但我不知道如何以懒惰的方式匹配它。我也不确定如何获得相应匹配的结果,所以我很欣赏一些代码示例。
如果你能给我一个提示,我会很高兴的。
答案 0 :(得分: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
答案 1 :(得分: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 - 尝试一下,它对学习非常有用。
答案 2 :(得分:2)
Regex r = new Regex("(?<A>\\w)+:(?<B>\\w)+=(?<C>\\w)*;");
\ w将匹配字母数字和下划线,相当于[a-zA-Z0-9 _]。
反斜杠在字符串中被转义,因此它变为\ \ w。
正则表达式捕获组A,B和C,并匹配C的0个或更多元素或由分号分隔的整个组。
您将拥有多个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;
// ...