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