C# 验证数学方程的正则表达式

C# 验证数学方程的正则表达式,c#,regex,C#,Regex,我需要使用正则表达式验证c#中的表达式 要验证的字符串具有以下规则: 表达式中只能使用三个变量:[椅子],[桌子],[风扇](请注意,方括号中包含了这三个变量 只能使用四个数学运算符:+,-,/* 可以使用支架(我们需要确保支架放置正确) 可以使用浮动常数:例如,10.55、22.23、3等 第一个目标是验证输入的字符串是否遵循上述规则 (稍后,我们可能还需要解析和计算该值。但问题基本上是关于验证正则表达式的。) 3.可以使用括号(我们需要确保括号放置正确) 请记住,带平衡括号的单词的语言是不规

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

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

  • 表达式中只能使用三个变量:[椅子],[桌子],[风扇](请注意,方括号中包含了这三个变量
  • 只能使用四个数学运算符:+,-,/*
  • 可以使用支架(我们需要确保支架放置正确)
  • 可以使用浮动常数:例如,10.55、22.23、3等
  • 第一个目标是验证输入的字符串是否遵循上述规则

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

    3.可以使用括号(我们需要确保括号放置正确)

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

    这意味着,如果您确实想使用正则表达式来完成任务,那么您必须依赖于正则表达式引擎特定的扩展

    基本上,正则表达式不是执行此任务的好工具。您应该了解上下文无关语法,以及可以生成C#解析器的解析器生成器

    进一步如下:

    3.可以使用括号(我们需要确保括号放置正确)

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

    这意味着,如果您确实想使用正则表达式来完成任务,那么您必须依赖于正则表达式引擎特定的扩展

    基本上,正则表达式不是执行此任务的好工具。您应该了解上下文无关语法,以及可以生成C#解析器的解析器生成器

    进一步如下:


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

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

    (\[[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来了解发生了什么,但正则表达式就像一个黑匣子。如果在这种模式中存在错误,修复它将困难得多。即使您完全理解t正在继续,祝你好运能够把这个怪物交给其他开发者


    我鼓励你学习上面的表达,试着找出它是如何工作的以及为什么工作的,甚至可以进行修改。但是为了你自己和你的同事的理智,不要将这个或它的任何私生子兄弟姐妹纳入你的项目中。aioobe为你提供了一个开始寻找正确方法的好地方。我强烈建议遵循这条路径。

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

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

    (\[[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来了解发生了什么,但正则表达式就像一个黑匣子。如果在这种模式中存在错误,修复它将困难得多。即使您完全理解t正在继续,祝你好运能够把这个怪物交给其他开发者

    我鼓励你学习上面的表达,试着找出它是如何工作的以及为什么工作的