我需要使用正则表达式验证 C# 中的表达式。
要验证的字符串有以下规则:
- 表达式中只能使用三个变量:[chair]、[table]、[fan](请注意方括号内。
- 只能使用四种数学运算符:+、-、/、*
- 可以使用括号(我们需要确保括号放置正确)
- 可以使用浮点常量:例如,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) 个变量或允许 bool 运算符。你将如何改变这种模式?我保证我第一次尝试修改它会失败,而且这甚至没有它所能达到的那么复杂。尽管如此,你应该已经看到我在写这个的时候把它弄坏了多少次。
你可以尝试在 SO 上再次发帖,也许有人可以破译它。尽管如此,您仍必须进行大量测试以确保任何修订都是正确的。这导致...
问题 #2 - 测试
您如何调试任何修订? 这就是为什么我说我不在生产代码中使用它。使用过程代码,您可以设置断点并使用 QuickWatch 找出发生了什么,但正则表达式就像一个黑盒子。如果此模式中存在错误,则修复它会困难得多。即使您完全了解正在发生的事情,也祝您好运,能够将这个怪物交给其他开发人员。
我鼓励您研究上面的表达式,尝试弄清楚它的工作原理和原因,甚至尝试修改。 但为了您自己和与您一起工作的任何人的理智,请不要将这个或它的任何 SCSS sibling 合并到您的项目中。 aioobe 为您提供了一个开始研究执行此操作的正确方法的好地方。我强烈建议您走这条路。
