0

我正在研究这个正则表达式

((([(]?[-]?[0-9]*[.]?[0-9]+)+([\/\+\-\*])+)+([0-9]*[.]?[0-9]+[)]?)+[\+\-\*\/]?([0-9]*)*)+

我需要它来接受任何表达式,例如:(2+2*7)-4+2/(5-3)+2
并且我想避免表达式:(2+3)- or 2+2-(2+3

目标是从用户那里获取表达式并将其分解为令牌,但在此之前我想检查输入的有效性。

4

1 回答 1

3

在最一般的形式中,正则表达式可以描述正则语言。另一方面,数学公式通常被形式化为上下文无关语言,它们是常规语言的超集。Chomsky 层次结构清楚地表明了这一区别:常规语言属于第 3 类,而上下文无关语言属于更一般的第 2 类。

直观地说,这里的关键区别是常规语言无法计数,因此它们无法平衡左括号和右括号。可以使用有限状态自动机检测常规语言,但仅使用有限数量的状态,您可能无法跟踪到目前为止您看到了多少个左括号,因为它们可能有任意数量。

您可能想研究lexerparser之间的区别。通常你会使用前者和正则表达式,将你的流标记为数字、运算符等,而你会使用后者来构建和检查由这些标记组成的表达式。

于 2013-10-21T10:14:32.163 回答