我需要使用正则表达式验证c#中的表达式。
要验证的字符串具有以下规则:
第一个目标是验证输入的字符串遵循上述规则。
(稍后,我们可能需要解析并计算该值。但问题基本上是关于验证正则表达式。)
答案 0 :(得分:7)
我喜欢长深奥的正则表达式。他们让我感到温暖和模糊。但是,我不在我的项目中使用它们,因为它们通常不属于生产代码。我打算给你一个正常的几乎你所要求的一切,然后我将解释为什么这不是一个好主意。
这是基于你不能(或者至少我想不出如何)验证表达式是否正确的事实,但你可以使用一个来匹配格式错误的表达式。所以这就是:
(\[[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为您提供了一个开始寻找正确方法的好地方。我强烈建议遵循这条道路。
答案 1 :(得分:6)
<强> 3。可以使用括号(我们需要确保正确放置托架)
请注意,平衡括号的词语是不常规。
这意味着如果您确实想要为该任务使用正则表达式,则必须依赖正则表达式引擎特定扩展。
基本上,正则表达式不是此任务的好工具。你应该看一下上下文无关的语法,可能是解析器生成器,可以为C#生成解析器。
进一步阅读: