【问题标题】:regex to match at least one symbol and at least 2 numbers正则表达式匹配至少一个符号和至少 2 个数字
【发布时间】:2013-05-29 01:09:25
【问题描述】:

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

最好的方法是什么?

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

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

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

  1. 2+2
  2. 5*3
  3. 6 - 8

我的最终目标是用 PHP 构建一个计算器,现在我正在尝试确定哪些输入是有效的数学输入/有效的数学表达式,哪些不是。

【问题讨论】:

  • Lex 它而不是尝试 regexp hacks
  • 我强烈建议改用strtok 之类的东西。

标签: php regex math


【解决方案1】:

这将匹配您的测试。

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

【讨论】:

  • 请注意,您不需要在字符类中转义 +*/,但如果 - 在字符类的中间,您确实需要转义,否则它将指定一个范围!例如,8 , 5 将得到匹配,因为根据ascii table,, 在* 和/ 的范围内。 Online demo。因此,如果您使用[+*/-],则无需转义-,但如果斜杠用作delimiter,您确实需要转义。
  • @HamZa: 警告:preg_match(): Unknown modifier '-' ;) 会逃脱那个破折号
  • @HamZa: 抱歉,这是由于 ` before /` 丢失
【解决方案2】:

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

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

让我们在这里使用一些 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

建议:
这对于负数、括号、log 和 cos/sin 函数会变得相当复杂,所以最好使用解析器。

【讨论】:

  • 非常感谢您的解释和帮助!这有很大帮助。我在哪里可以获得或找到 PHP 的数学解析器?
  • @JayGatz 抱歉,我不知道我尝试过什么,您也许应该搜索一个并尝试一下。另外请谨慎使用那些使用 eval() 的解决方案,测试它们,因为它们可能存在一些安全问题。
  • @JayGatz 好的,我问过Dave,这是he suggested。
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 2017-10-01
  • 2013-06-24
  • 2018-07-11
  • 1970-01-01
相关资源
最近更新 更多