我想检查所有括号是否正确启动和关闭,并检查它是否为数学表达式或不在给定的字符串中。
前:
$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
是有效的字符串....
请帮助......
答案 0 :(得分:3)
你需要一种解析器。我不认为你可以通过正则表达式来处理这个问题,因为你必须检查括号的数量和顺序以及可能的嵌套表达式。下面这个类是Python based Math expression syntax validator of parentheses我发现的快速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);
}
答案 1 :(得分:1)
使用正则表达式返回如何打开括号和关闭括号?
然后检查两个大括号的数量....如果它是相等的那么你的表达是正确的,否则就错了......
答案 2 :(得分:0)
嗯,我想你正在寻找的东西是Context-free grammar或Pushdown automaton。它不能仅使用正则表达式来完成。 (至少没有简单或好的方式)
那是因为你正在处理嵌套结构。可以在Regular expression to detect semi-colon terminated C++ for & while loops
找到实现的一些想法