我正在为家庭作业准备一个Win应用程序,该程序可以从文本文件中加载二次方程或线性方程。我有2种格式: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]);
因为我不太了解正则表达式,所以我想问你是否可以使用字符串模式来帮助我,字符串模式可以有选择地匹配第一部分的格式(+-,浮点数,char ^ 2),然后匹配第二部分(+ -,浮点数,字符)和最后一部分(+-,浮点数= 0)
答案 0 :(得分:1)
以下几行中的内容将为您检测二次方程。它不是100%故障安全的,但在大多数情况下应该可以使用:
[+-]?\d*(\.\d+)?(?<var>\w)\^2\s*[+-]\s*\d*(\.\d+)?(?P=var)\s*[+-]\s*\d*(\.\d+)?
将接受ax^2 + bx + c
形式的内容,其中a,b和c为浮点数。
要使其更具可读性,可以按以下方式将其拆分:
var F = $"\d*(\.\d+)?"; //a floating number
var S = $"\s*[+-]\s*"; //+/- sign with leading/trailing space(s)
var Quad = "[+-]?" + F + $"(?<var>\w)\^2" + S + F + $"(?P=var)" + S + F
var Lin = F + $"\w" + S + F + $"\s*=\s*0"
答案 1 :(得分:1)
表达式[^2]
的这部分是一个否定的字符类,它与除2
如果要在字符类之外进行字面上的匹配,则必须对其进行转义\^
,否则其含义将是断言字符串开头的锚点。
使用\w
可以匹配单词字符,还可以匹配数字和下划线。如果要匹配a-z,可以将其添加到字符类中。请注意,您可以省略{1}
。
您可以在第一部分中使用可选的组(?:)?
:
(?:[+-]?\d+(?:\.\d+)?[a-z]\^2 [+-] )?\d+(?:\.\d+)?[a-z] [+-] \d+(?:\.\d+)? = 0
这将匹配:
(?:
非捕获组
[+-]?
可选+或-\d+(?:\.\d+)?
将1个以上的数字与可选的小数部分相匹配[a-z]\^2 [+-]
匹配char 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";
基于dotNET的注释,如果变量应该相同,则可以使用具有反向引用\1
的捕获组。要同时匹配两种格式,可以使用交替和锚点来声明字符串的开始和结束。
答案 2 :(得分:1)
尝试此模式。它可能不会遇到奇怪的情况。
([+-]*(\d+x)\^2\s*[+-]\s*)*(\d+x\s*[+-]\s*\d+\s*)=\s*\d+
分解:
[+-]*
-正负号(*
)使其为可选(\d+x)
-\d+
是一个或多个数字(数字),而x
是“ x”字符。您可以将其替换为任何字符,或将[a-zA-Z]{1}
替换为任意一个字母\^2
-文字“ ^ 2”(需要转义“ ^”字符)\s*
-可选的空格字符[+-]
-+或-\s*
-可选的空格字符*
-将组设为可选,这样即使不在该组中也不会失败\d+x
-任意数字后跟“ x”(与第一组相同)\s*
-可选空间[+-]
-+或-\s*
-可选空间\d+
-等式的最后一部分(例如:+ 5)(必需-可以用括号括起来,并在末尾添加*以使其为可选)\s*
-可选空间=
-等号\s*
-可选空间\d+
-等号后的任何数字**注意:这不允许除x之外的变量使用小数或任何字母。当前,仅方程式的开始部分是可选的,但并非总是如此。
希望这会有所帮助。