4

我在 C# 中使用正则表达式时遇到了问题。即,调试器显示正确的(IMO)结果,但是当我尝试在我的应用程序中打印结果时,它们是不同的(并且是错误的)。下面的代码:

Match match2 = Regex.Match("048 A Dream Within A Dream (satur) (123|433) K48", "(.*)(\\((.)*?\\))\\s\\((.)*?\\)\\s.*");
string nick = match2.Groups[1].Value;
string name = match2.Groups[0].Value;
Console.WriteLine("nick - '{0}', name - '{1}'", nick, name);

预期的结果会显示在调试器中,如下图所示:在此处输入图像描述

控制台显示不同(错误)的结果:

nick - '048 梦中之梦',名称 - '048 梦中之梦 (satur) (123|433) K48'

我如何解决它?我希望结果完全像在调试器中一样显示。

4

2 回答 2

9

您错过了Groups[0]始终代表整个比赛的事实。第一个捕获组位于Groups[1]. 你要:

string nick = match2.Groups[2].Value;
string name = match2.Groups[1].Value;

它在调试器中显示您所期望的原因是您正在查看;中字段的实现细节 GroupCollection当它被要求按数字分组时,如果请求的数字为 0,则返回匹配项,否则将数字偏移 1。

从文档中GroupCollection

如果匹配成功,则集合中的第一个元素包含与整个匹配对应的 Group 对象。如果正则表达式包括捕获组,则每个后续元素都表示一个捕获组。

于 2013-09-02T21:17:22.383 回答
3

您正在查看_groups字段,但它不完全是作为Groups属性返回的内容:

在此处输入图像描述

更改您的代码以使用Groups[1]Groups[2]

string nick = match2.Groups[2].Value;
string name = match2.Groups[1].Value;
于 2013-09-02T21:19:34.440 回答