PHP正则如何排除带$前缀的数字,避免被preg_replace误替换?
问题根因
你原来的正则使用的(?!\$)是负向先行断言,作用是校验当前位置后面的字符不是$,和你要实现的「排除前缀带$的数字」需求逻辑完全相反。
当正则扫描到$100,000.1时,会自动跳过开头的$字符,从第一个数字1的位置开始校验,此时该位置后续是数字而非$,满足匹配条件,因此带$前缀的数字也会被错误替换。
修正方案
改用负向后顾断言(?<!\$),校验当前位置前面的字符不是$,同时补充单词边界\b避免匹配到数字中间的片段,最终正则规则为:/(?<!\$)\b\d+(,\d{3})*\.?\d*/
修正后的完整代码如下:
<?php $str = '10,000.1 $100,000.1'; $pattern = '/(?<!\$)\b\d+(,\d{3})*\.?\d*/'; $replacement_str = 'Without$sign'; echo preg_replace($pattern, $replacement_str, $str); ?>
运行后输出结果为:Without$sign $100,000.1,符合预期要求。
内容的提问来源于stack exchange,提问作者i.c
相关产品推荐
相关产品推荐

