用于验证数学方程的正则表达式

本文关键字:正则表达式 方程 验证 用于 | 更新日期: 2023-09-27 18:07:45

我需要使用正则表达式验证c#中的表达式。

要验证的字符串有以下规则:

  1. 表达式中只能使用三个变量:[chair], [table], [fan](请注意方括号中包含)。
  2. 只能使用四种数学运算符:+、-、/、*
  3. 可以使用括号(我们需要确保括号的位置正确)
  4. 可以使用浮点常量:例如,10.55,22.23,3等。

第一个目标是验证输入的字符串是否符合上述规则。

(稍后,我们可能还需要解析和计算该值。但是这个问题基本上是关于验证正则表达式的)

用于验证数学方程的正则表达式

我喜欢冗长深奥的正则表达式。它们让我感到温暖和舒适。但是,我不会在我的项目中使用它们,因为它们通常不属于生产代码。我将给你一个正则表达式,它几乎可以完成你所要求的所有事情,然后我将解释为什么这不是一个好主意。

这是基于这样一个事实:您不能(或者至少我想不出如何)验证表达式是正确的,但是您可以使用一个表达式来匹配格式错误的表达式。这里是:

('[[a-z0-9]+']).*?(?(1)('[[a-z0-9]+']).*?)(?(2)('[[a-z0-9]+']).*?)(?(3)('[[a-z0-9]+']).*?)|[/+*.-]{2,}|[^'[']0-9a-z/+*.-]|(?>[0-9]+(?:'.[0-9]+)*)[^/+*-]|'[[^']]+(?:'[|$)|'[[^a-z0-9]*[^a-z0-9']]

现在再看一下这个模式…真的很好看。因为一旦你把它提交到你的代码中,你就要对它负责。

问题1 -维护

当你改变规格时会发生什么?假设您想要允许(4)个变量或允许布尔运算符。你将如何改变这种模式?我敢保证,我第一次修改它的尝试会失败,这甚至没有那么复杂。不过,你应该看看我写这篇文章的时候弄坏了多少次。

你可以试着在SO上再发一次,也许有人能破译它。尽管如此,你还是需要做一些测试来确保任何修改都是正确的。

问题#2 -测试

如何调试任何版本?这就是为什么我说我不在生产代码中使用它的原因。对于过程代码,您可以设置断点并使用QuickWatch来弄清楚发生了什么,但是正则表达式就像一个黑盒子。如果此模式中存在错误,则修复它将困难得多。即使你完全理解发生了什么,祝你好运,能够把这个怪物交给其他开发人员。

我鼓励你研究上面的表达式,试着弄清楚它是如何工作的,为什么工作,甚至尝试修改。但是为了您自己和与您一起工作的任何人的理智,不要将它或它的任何私生子兄弟合并到您的项目中。Aioobe为您提供了一个开始寻找正确方法的好地方。我强烈建议你遵循这条道路。

3。可以使用括号(我们需要确保括号的位置正确)

请记住,带有平衡括号的单词的语言是,而不是正则的

这意味着如果你真的想在任务中使用正则表达式,你将不得不依赖于特定于regex引擎的扩展。基本上,正则表达式不是执行此任务的好工具。您应该了解上下文无关的语法,以及可以为c#生成解析器的解析器生成器。

进一步SO读数:

    什么是好的c#编译器-编译器/解析器生成器?