
本文介绍如何用 php 正则表达式精准截取字符串中首次出现“大写字母紧接数字”位置之前的内容,适用于如 `ab001j1` → `ab001` 这类清洗需求。
在处理编码、产品编号或序列号(如 'AB001J1'、'ZR010F2'、'ZQ10B5')时,常需剥离末尾的“单个大写字母 + 单个数字”后缀,保留主体部分(即 AB001、ZR010、ZQ10)。注意:这不是简单匹配“一个字母+一个数字”,而是识别字母数字结构的边界点——即数字后紧跟大写字母的位置,并在该位置进行切割。
推荐采用 preg_split() 配合零宽断言(lookaround) 实现高精度分割:
$word = 'AB001J1';
$output = preg_split("/(?<=[0-9])(?=[A-Z])/", $word, 2)[0];
echo $output; // 输出:AB001✅ 正则解析:
- (?前面是数字;
- (?=[A-Z]) —— 正向先行断言(positive lookahead),要求当前位置后面是大写英文字母;
- 二者组合 /(?
- 第三个参数 2 表示最多分割成 2 部分(提升效率,避免全量拆分);
- [0] 取分割后的首段,即目标结果。
⚠️ 注意事项:
- 该方案假设后缀格式严格为「单个大写字母 + 单个数字」(如 J1),且字母为 ASCII 大写(A–Z)。若需支持小写或 Unicode 字母(如 j1 或中文环境),可改用 (?
- str_replace() 不适用本场景——它用于字符串替换,而 /^(?=.*\pL)(?=.*\p{Nd})/ 是错误的锚定正则,既未捕获位置,也无法实现“截断”逻辑;
- 若输入不含匹配模式(如 'ABC123'),preg_split 将返回原字符串数组,[0] 仍安全有效。
? 扩展建议:如需更健壮的清洗(例如兼容 X9Y8Z7 多组后缀),可用 preg_replace('/[A-Z]\d+$/','',$word) 直接移除结尾的「大写字母+数字」组合(支持多位数字),但需根据实际业务规则权衡精确性与灵活性。










