找到第一个负数,并在前面加零

时间:2017-07-05 07:17:46

标签: php regex preg-replace

我想在第一次出现0之后插入-后跟一个数字。

我尝试过以下简单的代码。

$formula = '[ (((-594 - 0) )/ 55032411) *244 ]';
preg_match('/^-?\d+(\.\d+)?$/', $formula, $match);

print_r($match);
$result = str_replace($match[0],'0'.$match[0],$formula);
echo $result;
exit;

我想要以下结果。

[ (((0-594 - 0) )/ 55032411) *244 ]

3 个答案:

答案 0 :(得分:1)

如果对单个数字使用前瞻,则不需要捕获组。这是一个非常快速的模式。

模式:-(?=\d)

Pattern Demo

代码:(Demo

$formula='[ (((-594 - 0) )/ 55032411) *244 ]';
var_export(preg_replace('/-(?=\d)/','0-',$formula,1)); // match -, prepend 0

输出:

'[ (((0-594 - 0) )/ 55032411) *244 ]'

答案 1 :(得分:0)

使用preg_replace函数的解决方案:

$formula = '[ (((-594 - 0) )/ 55032411) *244 ]';
$result = preg_replace('/-?\d+(\.\d+)?/', '0$0', $formula, 1);

print_r($result);

输出:

[ (((0-594 - 0) )/ 55032411) *244 ]

传递给1的第四个参数preg_replace是输入字符串中模式的最大替换

答案 2 :(得分:0)

因为我坚信Regex!= 42我制作了一个可以正常使用的非正则表达式。
简而言之,它会找到字符串中的第一个-并保存位置 在此之前的任何事情 - 是$ part,但我使用str_replace删除所有[() and space 然后,如果此部分为空,则在第一个-之前没有数字,因此添加0。

它有点复杂,但由于它不使用正则表达式,它可能会更快。但是,如果在计算开始时使用除[() and space之外的其他符号,则需要将它们添加到数组中以进行删除 现在我想起来可能+-/*应该在那里。

 $formula = '[ (((-594 - 0) )/ 55032411) *244 ]';
 $pos = strpos($formula, "-");
 $part = str_replace(array("(",")","["," "), array("","","",""),substr($formula, 0, $pos));

If($part ==""){
     $formula = substr($formula, 0,$pos) ."0". substr($formula, $pos);
 }

Echo $formula;

我承认这很复杂,但我想尝试制作非正则表达式解决方案 https://3v4l.org/TaSjr