首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表示匹配至少一个符号和至少两个数字

表示匹配至少一个符号和至少两个数字
EN

Stack Overflow用户
提问于 2013-06-02 21:07:45
回答 2查看 1.7K关注 0票数 2

我试图在PHP语句中使用regex来检查至少包含1 +、-、*或/和至少2个数字的字符串。它们之间可以有任意数量的空间。

做这件事最好的方法是什么?

下面我试着编写一个regex,但这似乎与我的测试用例不匹配。

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

在这里,将通过一些测试用例:

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

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

EN

回答 2

Stack Overflow用户

发布于 2013-06-02 21:31:05

这将与你的测试相匹配。

代码语言:javascript
复制
/^
[0-9]+    # first number
\s*       # any whitespace
[+*\/-] # operand
\s*       # any whitespace
[0-9]+    # second number
$/x
票数 1
EN

Stack Overflow用户

发布于 2013-06-02 21:32:23

您的正则表达式永远不会匹配个位数数字,因为您使用的是{2,},这意味着匹配字符2次或更多次。

让我们来看看这个正则表达式:

#(\d+)\s*([+/*-])\s*(\d+)#

  • #:划界器
  • (\d+):匹配一个数字一次或多次,然后分组。
  • \s*:匹配空格0或更多次
  • ([+/*-]):一次匹配+-*/并分组
  • \s*:匹配空格0或更多次
  • (\d+):匹配一个数字一次或多次,然后分组。
  • #:划界器

让我们在这里使用一些PHP和一个函数,我使用了here

代码语言:javascript
复制
$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';
    }
}

输出:

代码语言:javascript
复制
2 + 2 = 4
5 * 3 = 15
6 - 8 = -2

建议:

这将变得相当复杂的负数,括号,日志和cos/sin函数,所以您最好使用一个解析器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16887325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档