C# 检查字符串的模式是否正确并加以区分
我正在制作一个win应用程序,用于从文本文件加载二次或线性方程的家庭作业。我有两种格式: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]); 因为我不太懂正则表达式,所
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
这将符合:
非捕获组(?:
可选+或-[+-]?
将1+位与可选的小数部分匹配\d+(?:\。\d+)
匹配字符a-z,然后[a-z]^2[+-]
空格可选+或-和空格^2
关闭非捕获组并将其设置为可选)?
将1+位数字与可选小数部分、字符a-z、空格、可选+或-和空格匹配\d+(?:\。\d+)[a-z][+-]
将1+位与可选的小数部分匹配,空格=空格0\d+(?:\。\d+)=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*)-第二个捕获组:线性块(必需-可将*添加到末端,使其成为可选)
-后跟“x”的任何数字(与第一组相同)\d+x
-可选空格\s*
-要么+要么-[+-]
-可选空格\s*
-等式的最后一段(例如:+5)(必需-可以用括号括起来,并在末尾添加*以使其成为可选)\d+
-可选空格\s*
- =\s*\d+
-等号=
-可选空格\s*
-等号后的任何数字\d+
希望这能有所帮助。理解正则表达式可能是一项挑战。尤其是像我这样的人,他们没有足够的时间来熟练地使用它。我总是使用这个页面来帮助我构建和测试我的正则表达式:。@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+