C# 正则表达式字符串解析

Sco*_*ott 5 .net c# regex

我已经写好了表达式,但是每当我运行代码时,我都会得到整个字符串和一大堆空值:

Regex regex = new Regex(@"y=\([0-9]\)\([0-9]\)(\s|)\+(\s+|)[0-9]");
Match match = regex.Match("y=(4)(5)+6");

for (int i = 0; i < match.Length; i++)
{
    MessageBox.Show(i+"---"+match.Groups[i].Value);
}
Run Code Online (Sandbox Code Playgroud)

预期输出:4、5、6(在不同的 MessageBox 中)

实际输出:y=(4)(5)+6

它查找输入的字符串是否正确,但一旦正确,我就无法获得特定值(4、5 和 6)。我该怎么做才能获得该代码?这可能是非常简单的事情,但我已经尝试查看 MSDN match.NextMatch 文章,这似乎也无济于事。

谢谢!

LTA*_*sta 5

目前,您没有指定任何组。(除了周围的空间。)

您可以使用括号指定组。您当前使用的括号有反斜杠,因此它们被用作匹配的一部分。在其中添加一组额外的括号。

像这样:

new Regex(@"y=\(([0-9]+)\)\(([0-9]+)\)\+([0-9]+)");
Run Code Online (Sandbox Code Playgroud)

并带有空格:

new Regex(@"y\s*=\s*\(([0-9]+)\)\s*\(([0-9]+)\)\s*\+\s*([0-9]+)");
Run Code Online (Sandbox Code Playgroud)

这也将允许部分之间的空格是可选的,因为 * 表示 0 或更多。这比上面给出的 (?:\s+|) 更好,因为您不需要空格组。这也更好,因为管道意味着“或”。你在用 \s+| 说什么 是“一个或多个空格或什么都没有”。这与 \s* 相同,即“零个或多个空格”。

另外,我使用了 [0-9]+,因为这意味着 1 位或更多位数字。这允许匹配具有多个数字的数字,例如 10 或 100。另一个注意事项,使用 [0-9] 比 \d 更好,因为 \d 所指的不仅仅是我们习惯的数字。