Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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#_Regex_Winforms - Fatal编程技术网

C# 检查字符串的模式是否正确并加以区分

C# 检查字符串的模式是否正确并加以区分,c#,regex,winforms,C#,Regex,Winforms,我正在制作一个win应用程序,用于从文本文件加载二次或线性方程的家庭作业。我有两种格式:ax^2+bx+c=0或ax+b=0 我的问题是,我需要区分它是二次型还是线性型,并检查它们的格式是否正确,但我对字符串模式有问题,我想出了类似的方法,但它不起作用 string pattern = @"?([+-]?([0-9]*[.])?[0-9]+\w{1}[^2])([+-][0-9]*[.])?[0-9]+\w{1})([0-9]*[.])?[0-9]+ \=[0]); 因为我不太懂正则表达式,所

我正在制作一个win应用程序,用于从文本文件加载二次或线性方程的家庭作业。我有两种格式:
ax^2+bx+c=0
ax+b=0

我的问题是,我需要区分它是二次型还是线性型,并检查它们的格式是否正确,但我对字符串模式有问题,我想出了类似的方法,但它不起作用

string pattern = @"?([+-]?([0-9]*[.])?[0-9]+\w{1}[^2])([+-][0-9]*[.])?[0-9]+\w{1})([0-9]*[.])?[0-9]+ \=[0]);

因为我不太懂正则表达式,所以我想问您是否可以帮助我使用字符串模式,该模式可以选择匹配第一部分的格式(+-,float number,char^2),然后匹配第二部分(+-,float number,char)和最后一部分(+-,float number,=0)

下面几行中的内容将为您检测二次方程。它不是100%故障安全型,但在大多数情况下应能工作:

[+-]?\d*(\.\d+)?(?<var>\w)\^2\s*[+-]\s*\d*(\.\d+)?(?P=var)\s*[+-]\s*\d*(\.\d+)?

表达式的这部分
[^2]
是一个与除
2

如果要在字符类之外逐字匹配它,则必须将其转义为
\^
,否则其含义将是一个锚来断言字符串的开头

使用
\w
可以匹配单词字符,也可以匹配数字和下划线。如果要匹配a-z,可以将其添加到角色类中。注意,您可以省略
{1}

第一部分可以使用可选组
(?:)?

(?:[+-]?\d+(?:\.\d+)?[a-z]\^2 [+-] )?\d+(?:\.\d+)?[a-z] [+-] \d+(?:\.\d+)? = 0
这将符合:

  • (?:
    非捕获组
    • [+-]?
      可选+或-
    • \d+(?:\。\d+)
      将1+位与可选的小数部分匹配
    • [a-z]^2[+-]
      匹配字符a-z,然后
      ^2
      空格可选+或-和空格
  • )?
    关闭非捕获组并将其设置为可选
  • \d+(?:\。\d+)[a-z][+-]
    将1+位数字与可选小数部分、字符a-z、空格、可选+或-和空格匹配
  • \d+(?:\。\d+)=0
    将1+位与可选的小数部分匹配,空格=空格0
比如说

String pattern = @"(?:[+-]?\d+(?:\.\d+)?[a-z]\^2 [+-] )?\d+(?:\.\d+)?[a-z] [+-] \d+(?:\.\d+)? = 0";
|

根据的注释,如果变量应相同,则可以使用带有反向引用的捕获组
\1
。要匹配这两种格式,可以使用交替和锚来断言字符串的开始和结束


试试这个模式。它可能不会捕捉奇怪的情况

([+-]*(\d+x)\^2\s*[+-]\s*)*(\d+x\s*[+-]\s*\d+\s*)=\s*\d+
细分:

  • ([+-](\d+x)^2\s[+-]\s*)*-第一个捕获组:可选
    • [+-]*
      -正/负符号(
      *
      )使其成为可选的
    • (\d+x)
      -
      \d+
      是一个或多个数字(数字),
      x
      是“x”字符。您可以将其替换为任何字符或任何一个字母的
      [a-zA-Z]{1}
    • ^2
      -用于“^2”的文字(需要转义“^”字符)
    • \s*
      -可选空格字符
    • [+-]
      -要么+要么-
    • \s*
      -可选空格字符
    • *
      -使组成为可选组,以便在不存在组时不会失败
  • (\d+x\s*[+-]\s*\d+\s*)-第二个捕获组:线性块(必需-可将*添加到末端,使其成为可选)
    • \d+x
      -后跟“x”的任何数字(与第一组相同)
    • \s*
      -可选空格
    • [+-]
      -要么+要么-
    • \s*
      -可选空格
    • \d+
      -等式的最后一段(例如:+5)(必需-可以用括号括起来,并在末尾添加*以使其成为可选)
    • \s*
      -可选空格
  • =\s*\d+
    • =
      -等号
    • \s*
      -可选空格
    • \d+
      -等号后的任何数字
**注:除x外,变量不允许使用小数或任何字母。目前,只有等式的开头部分是可选的,但情况并非总是如此


希望这能有所帮助。

理解正则表达式可能是一项挑战。尤其是像我这样的人,他们没有足够的时间来熟练地使用它。我总是使用这个页面来帮助我构建和测试我的正则表达式:。@Thefourthbird是的,最后我使用了dotNET的解决方案,但由于答谢而出错,所以他们删除了它。但是这里的所有答案都很好,帮助我理解这个问题。二次方程要求你在
ax^2
bx
项中有相同的变量。使用
[a-z]
类并不能确保@dotNET有意义,谢谢。我可能错了,但我认为您的模式与OP的第二种格式不匹配……您的模式与OP的第二种格式不匹配。我很想解决这个问题,但看不出你说的是哪种模式
ax+b
在我看来应该可以很好地与
Lin
模式配合。@dotNET与第二个模式的配合我的意思是确实有一个,但当我测试它时没有匹配啊,我只匹配
ax+b
,缺少
=0
部分。现在修好了。谢谢您的指点。您正在将变量名硬编码到正则表达式中。看着OP的正则表达式,他似乎希望在这里有任意变量名。@dotNET你没有错。我建议使用
[a-zA-Z]{1}
,如果他需要任意变量名。在他的例子和大多数数学课程中,x是常用的变量名,所以我坚持用它来表示我的正则表达式模式。我明白你的意思了。这不仅仅是允许任意变量名。问题是,二次方程要求在
x^2
x
项中使用相同的变量。您必须使用反向引用来确保。有关示例,请参见其他两个答案。
([+-]*(\d+x)\^2\s*[+-]\s*)*(\d+x\s*[+-]\s*\d+\s*)=\s*\d+