1

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

这是我的代码:

$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);
}

我无法弄清楚我做错了什么。

4

3 回答 3

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
(
)

正如我怀疑你想要的那样。

http://codepad.viper-7.com/4FoQnB

于 2013-04-01T14:19:11.067 回答
0

鉴于您的表达,结果是预期的。

注意如何\D只能匹配一次(或随机数)。\D已经匹配了-,所以没有其他东西可以匹配/

您可能很想通过在表达式的大部分上放置一个量词来解决这个问题,但让我预测一下您将面临的问题,并建议您使用一个循环来替换单个操作数-操作数-操作数三元组时间,在无法替换时退出。这是因为没有单程正则表达式可以正确管理操作顺序(例如PEMDAS)。

于 2013-04-01T14:23:14.993 回答
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
于 2013-04-01T14:25:57.190 回答