我想在第一次出现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 ]
答案 0 :(得分:1)
如果对单个数字使用前瞻,则不需要捕获组。这是一个非常快速的模式。
模式:-(?=\d)
代码:(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