【问题标题】:Numerical expression of regex正则表达式的数值表达
【发布时间】:2018-05-18 14:43:16
【问题描述】:

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

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

我的尝试:

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

但是,当我输入短语&lt;expr_num&gt;&lt;operator_num&gt;&lt;expr_num&gt; 时,正则表达式由于开头的&lt;expr_num&gt; 处于无限递归中。

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

错误:recursive call could loop indefinitely

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

【问题讨论】:

  • 为什么没有定义&lt;expr_num&gt;?你能提供一些代码吗?
  • 有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。 你需要一个解析器!

标签: c# regex regular-language bnf ebnf


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多