C#中的正则表达式行为奇怪

4

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

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);

预期结果将显示在调试器中,如下图所示:enter image description here 控制台显示不同(错误)的结果:

nick - '048 A Dream Within A Dream',name - '048 A Dream Within A Dream (satur) (123|433) K48'

我该怎么办?我希望结果能像调试器中一样准确显示。
2个回答

9
你忽略了一个事实,即Groups[0]总是代表整个匹配。第一个捕获组在Groups[1]中。你需要这样做:
string nick = match2.Groups[2].Value;
string name = match2.Groups[1].Value;

在调试器中显示你预期的原因是你正在查看GroupCollection内部字段的实现细节;当按编号请求组时,如果请求的编号为0,则返回匹配项,否则将编号偏移1。
GroupCollection的文档中可以得知:
如果匹配成功,则集合中的第一个元素包含与整个匹配相对应的 Group 对象。每个后续元素表示捕获的组(如果正则表达式包括捕获组)。

非常感谢你们提供的宝贵信息和可行的解决方案! :) - Steven Bonell

3
你正在查看 _groups 字段,但这不是返回作为 Groups 属性的确切内容:

enter image description here

将代码更改为使用 Groups[1]Groups[2]
string nick = match2.Groups[2].Value;
string name = match2.Groups[1].Value;

谢谢你们两位提供宝贵的信息和可行的解决方案!我选择了Jon的答案,因为他回复得最快 - 希望你不介意。 - Steven Bonell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接