5

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

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

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

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

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

谢谢!

4

5 回答 5

5

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

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

像这样:

new Regex(@"y=\(([0-9]+)\)\(([0-9]+)\)\+([0-9]+)");

并带有空格:

new Regex(@"y\s*=\s*\(([0-9]+)\)\s*\(([0-9]+)\)\s*\+\s*([0-9]+)");

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

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

于 2012-10-04T12:51:54.163 回答
3

使用(命名的)捕获组。您还需要使用(?:)而不是()用于您不想捕获的。否则,它们也将在结果组中。

Regex regex = new Regex(@"y=(\([0-9]\))((\([0-9]\))(?:\s|)\+(?:\s+|)([0-9])");
Match match = regex.Match("y=(4)(5)+6");
Console.WriteLine("1: " + match.Groups[1] + ", 2: " + match.Groups[2] + ", 3: " + match.Groups[3]);

如果模式找到匹配项,则将该匹配项的组写入可以通过索引访问的属性(索引0包含完整匹配项)。

您还可以命名这些组以获得更具可读性的代码:

Regex regex = new Regex(@"y=(?<first>\([0-9]\))(?<second>(\([0-9]\))(?:\s|)\+(?:\s+|)(?<third>[0-9])");

现在,您可以通过 using 等访问捕获组match.Groups["first"]

于 2012-10-04T12:49:05.840 回答
3

您需要为您的组命名,以便稍后将它们拉出来。如何访问 .NET Regex 中的命名捕获组?

Regex regex = new Regex(@"y=\((?<left\>[0-9])\)\((?<right>[0-9])\)(\s|)\+(\s+|)(?<offset>[0-9])");

然后你可以像这样把它们拉出来:

regex.Match("y=(4)(5)+6").Groups["left"];
于 2012-10-04T12:51:29.000 回答
2

C# 超出了我的专业领域,但这可能有效:

@"y=\(([0-9])\)\(([0-9])\)(?:\s|)\+(?:\s+|)([0-9])"

它基本上是您的原始正则表达式,但在数字周围捕获组,并且不想要的捕获组更改为非捕获组:(?: ... )

于 2012-10-04T12:49:09.703 回答
2

Group[0] 将始终为您提供匹配的字符串,空值来自 (\s|)。

这将起作用:y=\((\d)\)\((\d)\)\s*\+\s*(\d)

从 1 开始的组计算您使用的括号,但如果您将它们转义,它们不计算在内(因为您告诉它它们只是要匹配的文本),所以这些数字需要它们自己的括号。在类似的情况下使用它也不是一个好主意(x|)?或 * 会更合适,因为你没有捕捉到那一点。

这可能会更好y=\((\d+)\)\((\d+)\)\s*\+\s*(\d+),因为它支持大于 10 的值。

于 2012-10-04T12:49:14.460 回答