2

我想检查所有括号是否正确开始和关闭,并检查它是否在给定字符串中是数学表达式。

前任 :

$str1 = "(A1+A2*A3)+A5+(B3^B5)*(C1*((A3/C2)+(B2+C1)))"

$str2 = "(A1+A2*A3)+A5)*C1+(B3^B5*(C1*((A3/C2)+(B2+C1)))"

$str3 = "(A1+A2*A3)+A5++(B2+C1)))"

$str4 = "(A1+A2*A3)+A5+(B3^B5)*(C1*(A3/C2)+(B2+C1))"

在上面的示例中$str1,并且$str4是有效的字符串....

请帮忙....

4

3 回答 3

2

你需要一种解析器。我认为您无法通过正则表达式来处理此问题,因为您必须检查括号的数量和顺序以及可能的嵌套括号。下面的这个类是我发现的基于 Python 的数学表达式语法验证器的快速 PHP 端口:

class MathExpression {

    private static $parentheses_open = array('(', '{', '[');
    private static $parentheses_close = array(')', '}', ']');

    protected static function getParenthesesType( $c ) {
        if(in_array($c,MathExpression::$parentheses_open)) {
            return array_search($c, MathExpression::$parentheses_open);
        } elseif(in_array($c,MathExpression::$parentheses_close)) {
            return array_search($c, MathExpression::$parentheses_close);
        } else {
            return false;
        }
    }

    public static function validate( $expression ) {
        $size = strlen( $expression );
        $tmp = array();
        for ($i=0; $i<$size; $i++) {
            if(in_array($expression[$i],MathExpression::$parentheses_open)) {
                $tmp[] = $expression[$i];
            } elseif(in_array($expression[$i],MathExpression::$parentheses_close)) {
                if (count($tmp) == 0 ) {
                    return false;
                }
                if(MathExpression::getParenthesesType(array_pop($tmp)) 
                    != MathExpression::getParenthesesType($expression[$i])) {
                    return false;
                }
            }
        }
        if (count($tmp) == 0 ) {
            return true;
        } else {
            return false;
        }
    }
}

//Mathematical expressions to validate
$tests = array(
    '(A1+A2*A3)+A5+(B3^B5)*(C1*((A3/C2)+(B2+C1)))',
    '(A1+A2*A3)+A5)*C1+(B3^B5*(C1*((A3/C2)+(B2+C1)))',
    '(A1+A2*A3)+A5++(B2+C1)))',
    '(A1+A2*A3)+A5+(B3^B5)*(C1*(A3/C2)+(B2+C1))'
);

// running the tests...
foreach($tests as $test) {
    $isValid = MathExpression::validate( $test );
    echo 'test of: '. $test .'<br>';
    var_dump($isValid);
}
于 2013-02-02T11:44:30.707 回答
1

好吧,我想您正在寻找的东西是一些无上下文语法Pushdown automaton。它不能只使用正则表达式来完成。(至少没有简单或好的方法)

那是因为您正在处理嵌套结构。一些实现的想法可以在这里找到正则表达式来检测分号终止的 C++ for & while 循环

于 2013-02-02T11:59:36.450 回答
-1

使用正则表达式返回多少个左括号和右括号?

然后检查两个大括号的数量......如果它相等,那么你的表达是对的,否则是错误的......

于 2013-02-02T11:11:07.483 回答