首页 > 解决方案 > 正则表达式的数值表达

问题描述

我需要编写一个由以下 bnf 形式给出的正则表达式:

<expr_num>:=<var>|<sign>|"("<expr_num>")"|<expr_num><operator_num><expr_num>

我的尝试:

var=\w*
sign=+|-
operator_num=[+|-|*|/]

但是,当我输入短语时<expr_num><operator_num><expr_num>,正则表达式<expr_num>在一开始就处于无限递归状态。

我的尝试:(?<expr_num>(?<var>(\[(\w+\d*)\]))|(?<sign>([\+|\-]\g<sign>)|(\d*))|(\((\g<expr_num>)\))|(\g<expr_num>[+|*|-|\/]{1}\g<expr_num>))$

错误:recursive call could loop indefinitely

如何解决这个问题呢?如何在 C# 中为此表达式创建解析器?

标签: c#regexregular-languagebnfebnf

解决方案


您可以在 Regex 中执行此操作,如此所示。如果您需要做的不仅仅是匹配算术表达式,例如评估它们,那么您就会遇到 Regex 的麻烦。如果是这种情况,你应该采取这个。那篇文章解释了如何解析表达式并获得正确的优先级。


推荐阅读