如何解析和匹配计算字符串?
这是我的代码:
$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 = '34.27-15.44/8.44';
echo $input."\n";
preg_match($pattern, $input, $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
只能匹配一次(或随机数)。\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