如何解析和匹配计算字符串?
这是我的代码:
$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);
}
我无法弄清楚我做错了什么。
答案 0 :(得分:2)
这是因为“?
”的贪婪,请尝试“+
”,如下所示:
$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
(
)
因为我怀疑你想要它。
答案 1 :(得分:0)
根据你的表达,结果是预期的。
请注意\D
只能匹配一次(或nonce)。 \D
已与-
匹配,因此其他任何内容都无法匹配/
。
你可能很想通过在表达式的大部分上放一个量词来解决这个问题,但是让我预测你将面临的问题,并建议你使用一个代替单词的循环操作数 - 操作符 - 操作数三元组一次,当不能进行替换时退出。这是因为没有单通道正则表达式可以正确地管理操作顺序(例如 PEMDAS)。
答案 2 :(得分:0)
试试这个。它适用于整数和浮点数:
$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