检查字符串是不是处于正确的模式并区分它们

Posted

技术标签:

【中文标题】检查字符串是不是处于正确的模式并区分它们【英文标题】:Check if strings are in a correct pattern and distinguish them检查字符串是否处于正确的模式并区分它们 【发布时间】:2019-09-22 07:33:42 【问题描述】:

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

我的问题是我需要区分它是二次的还是线性的,并检查它们的格式是否正确,但我对字符串模式有疑问,想出了这样的东西,但它不起作用

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

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

【问题讨论】:

理解正则表达式可能是一个挑战。特别是对于像我这样不经常使用它以精通它的人。我总是使用这个页面来帮助我构建和测试我的 RegEx 表达式:Online RegEx。 @Thefourthbird 是的,最后我使用了 dotNET 的解决方案,但由于在答案中表示感谢而犯了错误,因此他们将其删除。但是这里的所有答案都很棒,对我理解这个问题有很大帮助 【参考方案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"

【讨论】:

【参考方案2】:

试试这个模式。它可能无法捕捉到奇怪的情况。

([+-]*(\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 之外的变量的任何字母。目前,只有等式的开始部分是可选的,但并非总是如此。

希望这会有所帮助。

【讨论】:

您将变量名称硬编码到正则表达式中。查看 OP 的正则表达式,他似乎期望那里有任意变量名。 @dotNET 你没看错。如果他是期望的任意变量名,我建议使用[a-zA-Z]1。在他的示例和大多数数学课程中,x 是通用变量名,所以我只是坚持使用它作为我的正则表达式模式。不过我知道你来自哪里。 这不仅仅是允许任意变量名。问题是二次方程要求您在x^2x 术语中使用相同的变量。您必须使用反向引用来确保这一点。例如,请参阅其他两个答案。【参考方案3】:

这部分表达式[^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

【讨论】:

二次方程要求您在 ax^2bx 项中具有相同的变量。使用[a-z] 类并不能确保这一点。 @dotNET 这很有道理,谢谢。我可能错了,但我认为您的模式与 OP 的第二种格式不匹配。 ...您的模式与 OP 的第二种格式不匹配。我很想解决这个问题,但看不到您在说哪种模式。据我所知,ax + b 应该可以很好地与 Lin 模式配合使用。 @dotNET 对于第二个模式,我的意思确实是一个,但是当我测试它时,没有匹配到demo 啊,我只匹配ax + b,缺少= 0 部分。现在修好了。并感谢您指出。

以上是关于检查字符串是不是处于正确的模式并区分它们的主要内容,如果未能解决你的问题,请参考以下文章

请检查数据库连接字符串设置是不是正确或数据库服务器身份验证模式是不是SQL Server和

我们如何检查iphone是不是处于待机模式?

Python - 比较 2 个单词并检查它们是不是是字谜

检查字符串是不是包含模式,忽略位置。并返回项目匹配的索引

Doctype 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?

如何正确检查对象是不是被字符串化? JS [重复]