解析和匹配计算字符串

时间:2013-04-01 14:15:35

标签: 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);
}

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

3 个答案:

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

因为我怀疑你想要它。

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

答案 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