检查字符串是否以正确的模式进行区分,

时间:2019-05-03 18:10:41

标签: c# regex winforms

我正在为家庭作业准备一个Win应用程序,该程序可以从文本文件中加载二次方程或线性方程。我有2种格式:ax^2 + bx + c = 0ax + 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)

3 个答案:

答案 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";

Regex demo | C# demo

基于dotNET的注释,如果变量应该相同,则可以使用具有反向引用\1的捕获组。要同时匹配两种格式,可以使用交替和锚点来声明字符串的开始和结束。

Regex demo

答案 2 :(得分: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之外的变量使用小数或任何字母。当前,仅方程式的开始部分是可选的,但并非总是如此。

希望这会有所帮助。