Php 解析并匹配计算字符串

Php 解析并匹配计算字符串,php,regex,Php,Regex,如何解析和匹配计算字符串 这是我的代码: $pattern = '/(?:\d+(?:\.\d+)?\D)+\d+(?:\.\d+)/'; $input = [ '1.0+2.5*5.4', '5*8-4' ]; foreach($input as $string){ preg_match($pattern, $string, $match); print_r($match); } 我不知道我做错了什么。这是因为“?”的贪婪,请尝试“+”如下所示: 至于你的编辑

如何解析和匹配计算字符串

这是我的代码:

$pattern = '/(?:\d+(?:\.\d+)?\D)+\d+(?:\.\d+)/';
$input = [
    '1.0+2.5*5.4',
    '5*8-4'
];
foreach($input as $string){
    preg_match($pattern, $string, $match);
    print_r($match);
}

我不知道我做错了什么。

这是因为“
”的贪婪,请尝试“
+
”如下所示:

至于你的编辑:

$pattern = '/(?:\d+(?:\.?\d+)?\D)+\d+/';
$input = [
    '1.0+2.5*5.4',
    '5*8-4',
    '5*8-4string',
    'string5*8-4',
    'string'
];
foreach($input as $string){
    preg_match($pattern, $string, $match);
    print_r($match);
}
它给出:

Array
(
    [0] => 1.0+2.5*5.4
)
Array
(
    [0] => 5*8-4
)
Array
(
    [0] => 5*8-4
)
Array
(
    [0] => 5*8-4
)
Array
(
)
我猜是你想要的


根据您的表达式,结果是预期的

注意
\D
如何只能匹配一次(或nonce)<代码>\D已与
-
匹配,因此没有其他内容可以与
/
匹配


您可能想通过在表达式的较大部分添加一个量词来解决这个问题,但让我预测一下这样做将面临的问题,并建议您使用一个循环,一次替换一个操作数运算符操作数三元组,在无法进行替换时退出。这是因为没有一个单通道正则表达式可以正确管理操作顺序(例如PEMDAS)。

试试这个。它适用于整数和浮点数:

 $pattern = '/(?:\d+(?:(\.|)\d*)?\D)*\d*(?:(\.|)\d+)/';
 $input =array(
   '1.0+2.5*5.4',
   '5*8-4',
   '5*8-4string'
 );
 foreach($input as $string){
    echo "input:".$string."\n";
    preg_match($pattern, $string, $match);
    print_r("output:".$match[0]."\n");
  }
输出:

 input:1.0+2.5*5.4
 output:1.0+2.5*5.4
 input:5*8-4
 output:5*8-4
 input:5*8-4string
 output:5*8-4

\D
匹配公式中的
-
减号。你有两个点来匹配浮动。但是,
/
除法没有第二个占位符,也没有最后一个数字。请看我的答案,它适用于整数和浮点。然而,PCRE可以很好地匹配复杂的公式,包括运算符优先级和参数。你可以定义命名的子模式和
(?R
在它们上面递归。如果你愿意的话,这不再是单次传递了。@mario-很好的观点;忘记了那些正则表达式附加项。我不反对通过模式(单次或循环)进行匹配和解析.我想我的警告更多的是关于计算步骤,如果有的话。但是我可能弄错了。上次我回答这样一个问题时,似乎必须在循环中逐层进行替换。这可能不适用于中缀符号。已经做了更改..现在它适用于第一个输入..第二个输入带整数的put不起作用..已更新问题
 input:1.0+2.5*5.4
 output:1.0+2.5*5.4
 input:5*8-4
 output:5*8-4
 input:5*8-4string
 output:5*8-4