正则表达式匹配至少一个符号和至少2个数字

时间:2013-06-02 21:07:45

标签: php regex math

我正在尝试编写一个正则表达式,用于PHP中的if语句,以检查字符串是否包含至少1 +, - ,*或/和至少2个数字。它们之间可以有任意数量的空格。

这样做的最佳方式是什么?

我尝试在下面写一个正则表达式,但这似乎与我的测试用例不符。

我正在使用的正则表达式是:m/[0-9]{2,}[=-*/]+/

这里有一些测试用例可以通过:

  1. 2 +2
  2. 5 * 3
  3. 6 - 8
  4. 我的最终目标是用PHP构建计算器,现在我正在尝试确定哪些输入是有效的数学输入/有效的数学表达式,哪些不是。

2 个答案:

答案 0 :(得分:1)

这将符合您的测试。

/^
[0-9]+    # first number
\s*       # any whitespace
[+*\/-] # operand
\s*       # any whitespace
[0-9]+    # second number
$/x

答案 1 :(得分:1)

你的正则表达式永远不会匹配单位数字,因为你正在使用{2,}这意味着匹配一个字符2次或更多次。
所以让我们来看看这个正则表达式:
#(\d+)\s*([+/*-])\s*(\d+)#

  • #:delimiter
  • (\d+):匹配一个或多个数字,然后将其分组。
  • \s*:匹配空格零次或多次
  • ([+/*-]):匹配+-*/一次并将其分组
  • \s*:匹配空格零次或多次
  • (\d+):匹配一个或多个数字,然后将其分组。
  • #:delimiter

我们在这里使用一些PHP-Fu和我使用的函数here

$input = '2 +2
5*3
6 - 8';

$output = preg_replace_callback('#(\d+)\s*([+/*-])\s*(\d+)#', function($m){
    return $m[1].' '.$m[2].' '.$m[3].' = '. mathOp($m[2], (int)$m[1], (int)$m[3]);
}, $input); // You need PHP 5.3+. Anonymous function is being used here !
echo $output;

function mathOp($operator, $n1, $n2){
    if(!is_numeric($n1) || !is_numeric($n2)){
        return 'Error: You must use numbers';
    }
    switch($operator){
        case '+':
            return($n1 + $n2);
        case '-':
            return($n1 - $n2);
        case '*':
            return($n1 * $n2);
        case '/':
            if($n2 == 0){
                return 'Error: Division by zero';
            }else{
                return($n1 / $n2);
            }
        default:
            return 'Unknown Operator detected';
    }
}

<强>输出:

2 + 2 = 4
5 * 3 = 15
6 - 8 = -2

<强>建议:
这将使负数,括号,日志和cos / sin函数变得相当复杂,因此您最好使用解析器。