Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#正则表达式字符串解析_C#_.net_Regex - Fatal编程技术网

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

C#正则表达式字符串解析,c#,.net,regex,C#,.net,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); } Reg

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

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);
}
Regex Regex=newregex(@“y=\([0-9]\)\([0-9]\)(\s|)\+(\s++)[0-9]”);
Match=regex.Match(“y=(4)(5)+6”);
for(int i=0;i
预期输出:4、5、6(在不同的消息框中

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

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

谢谢!

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

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])");
Regex Regex=newregex(@“y=(?\([0-9]\)(?(\([0-9]\))(?:\s\)\+(?:\s+)(?[0-9]);
现在,您可以使用
match.groups[“first”]
等访问捕获组。

C#不属于我的专业范围,但这可能会起作用:

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

它基本上是您的原始正则表达式,但是随着捕获组围绕数字,不需要的捕获组变为非捕获组:
(?:…)
组[0]将始终为您提供匹配的字符串,空值来自(\s|)

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

从1开始的组计算你使用的括号,但是如果你转义它们,它们就不计算(因为你告诉它它们只是文本匹配),所以这些数字需要自己的括号。当像?或*这样的东西更合适时,使用
(x |)
也不是一个好主意,因为你没有捕获那个位


这可能会更好,因为它支持大于10的值。

您需要命名您的组,以便以后可以将它们拉出


按照目前的情况,您没有指定任何组(除了空格周围)

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

像这样:

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]+,因为这意味着一个或多个数字。这允许匹配多个数字,如10或100。另一个旁注是使用[0-9]比\d更好,因为\d所指的不仅仅是我们习惯使用的数字。

我不太明白这个问题-您是否在寻找正则表达式来匹配格式不正确的字符串?正则表达式匹配字符串很好-它返回true(或match.Success)当所有变量都被填充时。然而,获取每个单独的值是我所追求的。您是否尝试过检查te.Captures?只是更新了我的答案,使其更清晰。希望您现在了解您的模式的每个部分都在做什么。
new Regex(@"y=\(([0-9]+)\)\(([0-9]+)\)\+([0-9]+)");
new Regex(@"y\s*=\s*\(([0-9]+)\)\s*\(([0-9]+)\)\s*\+\s*([0-9]+)");