题
如何验证具有正则表达式线性方程或是否有除了使用正则表达式的另一种方式。我将使用^表示指数。
2×+ 3 = 8 //这应该验证细
3×+ 2Y + 4Z = 12 //这应该验证细
4倍^ 2 + 2Y = 22 //这不应该由于功率的验证。
4XY + 3Y = 45 //这不应该因为两个未知数的产物确认。
2 / X + 4Y = 22 //这不应该因为在分母中未知的验证
(3/4)X + 3Y + 2Z = 40 //这应该验证细
解决方案
我通过写入用一个有效的线性方程的定义巴科斯开始-Naur 符号,用来:
<integer> := <digit> | <integer> <digit>
<constant> := <integer> | ...
<variable> := <letter>
<term> := <constant> | <variable> | <constant> <variable>
等。
有很多方法可以把它转换成一个验证器。用起来会有的经历,我会使用YACC或野牛写一个解析器,如果输入的是一个有效的线性方程,只会产生一个解析树。
您可能会发现正则表达式太有限,做你所需要的 - 我只是不使用它们不够了解
其他提示
你所提到的情况下,很容易:
fail if /[xyz]\s*\^/;
fail if /\/\s*[xyz]/;
fail if /([xyz]\s*){2,}/;
(这是Perl的语法,假设$_
包含表达,fail
是不管它是什么,当你想放弃的时候你怎么做。)
下面就可以与任何为一个可变有效的表达式替换xyz
。
但总的来说,这将需要表达,这是法/ yacc的或类似的东西,而不是一个正则表达式。
工作的实际解析例如,如果“XY”是一个合法的变量名,则当然这一切碎饲料上。
不隶属于 StackOverflow