繁体   English   中英

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

[英]C# Regex string parsing

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

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文章,这似乎也没有帮助。

谢谢!

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

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

像这样:

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指的不仅仅是我们习惯的数字。

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

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

现在,您可以使用match.Groups["first"]等访问捕获组。

您需要为您的群组命名,以便以后将其删除。 如何在.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"];

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

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

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

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

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

它是从1开始计算你使用的括号的组,但如果你逃避它们,它们不计算(因为你告诉它它们只是匹配的文本),所以这些数字需要它们自己的括号。 什么时候使用(x|)也不是一个好主意? 或*会更合适,因为你没有抓住那一点。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM