【发布时间】:2010-04-07 19:23:10
【问题描述】:
例如,这些是有效的数学表达式:
a * b + c
-a * (b / 1.50)
(apple + (-0.5)) * (boy - 1)
这些是无效的数学表达式:
--a *+ b @ 1.5.0 // two consecutive signs, two consecutive operators, invalid operator, invalid number
-a * b + 1) // unmatched parentheses
a) * (b + c) / (d // unmatched parentheses
匹配浮点数没有问题,但括号匹配有困难。任何的想法?如果有比正则表达式更好的解决方案,我也会接受。但首选正则表达式。
========
编辑:
我想对我对“已接受的答案”的选择做一些cmet,希望有相同问题并找到这个帖子的人不会被误导。
有几个我认为“接受”的答案,但我不知道哪个是最好的。所以我(几乎)随机选择了接受的答案。除了公认的答案外,我还建议阅读 Guillaume Malartre 的答案。他们都为我的问题提供了切实可行的解决方案。对于有些严格/理论的答案,请阅读 David Thornley 在接受的答案下的 cmets。正如他所提到的,Perl 对正则表达式的扩展(源自正则语言)使其“不规则”。 (我在我的问题中没有提到任何语言,所以大多数回答者都假设正则表达式的 Perl 实现——可能是最流行的实现。当我发布我的问题时我也是如此。)
如果我在上面说错了,请纠正我。
【问题讨论】:
-
您要求做一些不可能的事情,但您没有提及您使用的语言。
-
嗯...我真正想知道的是,是否可以使用正则表达式来做到这一点?如果不是,那么执行此操作的最佳算法是什么?我想基于通用算法而不是语言特性来实现它。
-
Ethan,正则表达式只能处理正则语言。 a^nb^nb^na^n 形式的所有字符串都是非常规语言的示例。因此, (1 + 2 * (3 + 4 * (5 + 6 * .... N-3 + N-2 * (N-1 + N-2))...) 是一个有效的算术表达式,但是不会构成常规语言(变量甚至 N)。
-
@all 回答者:我知道为这个特定任务编写解析器可能是一种更优雅的方式。但是用正则表达式实现它也是一个很好的讨论话题。
-
现在问题似乎变成了:实现是否“常规”? :)