【问题标题】:Validating linear equations with regular expressions?用正则表达式验证线性方程?
【发布时间】:2009-10-15 04:08:43
【问题描述】:

如何使用正则表达式验证线性方程,或者除了使用正则表达式之外还有其他方法。我将使用 ^ 来表示指数。

2x + 3 = 8 //这应该可以验证

3x + 2y + 4z = 12 //这应该可以验证

4x^2 + 2y = 22 //这不应该验证,因为权力。

4xy + 3y = 45 //这不应该验证,因为两个未知数的乘积。

2/x + 4y = 22 //这不应该验证,因为分母中的未知数

(3/4)x + 3y + 2z = 40 //这应该可以验证。

【问题讨论】:

    标签: regex linear-equation


    【解决方案1】:

    我首先使用Backus-Naur 表示法编写有效线性方程的定义,例如:

    <integer> := <digit> | <integer> <digit>
    <constant> := <integer> | ...
    <variable> := <letter>
    <term> := <constant> | <variable> | <constant> <variable>
    

    等等。

    有很多方法可以将其变成验证器。有了一些经验,我会使用 yacc 或 bison 编写一个解析器,如果输入是一个有效的线性方程,它只会生成一个解析树。

    您可能会发现正则表达式太有限,无法满足您的需求 - 我只是没有使用它们,无法知道。

    【讨论】:

    • 谢谢,我会研究一下 yacc 和 bison。
    【解决方案2】:

    你提到的案例很简单:

    fail if /[xyz]\s*\^/;
    fail if /\/\s*[xyz]/;
    fail if /([xyz]\s*){2,}/;
    

    (这是 Perl 语法,假设 $_ 包含表达式,而 fail 是你想放弃时所做的任何事情。)

    在这里,您可以将xyz 替换为一个变量的有效表达式。

    但一般来说,这需要对表达式进行实际解析,这是 lex/yacc 或类似的工作,而不是正则表达式。

    例如,如果“xy”是一个合法的变量名,那么当然这一切都会崩溃。

    【讨论】:

    • 谢谢,这仍然有点令人困惑,因为我不熟悉 perl。另外,这些只是我给出的一些样本,方程式是未知的。
    猜你喜欢
    • 1970-01-01
    • 2015-08-11
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2021-02-24
    相关资源
    最近更新 更多