正则表达式需求:根据是否含连字符提取批号前缀字符
解决方案:批号前缀提取正则及Statistica实现
需求回顾
需要从两类批号中提取前缀:
- 无连字符批号:提取前3个字符(例:
RC219C0425→RC2) - 带连字符批号:提取第一个连字符前的全部内容(要求该内容长度≥3,例:
AR4-23-QCT-001→AR4,LC3B-18-TEK-015→LC3B)
原正则问题分析
你之前使用的正则"(^[A-Z0-9][A-Z0-9][A-Z0-9][[A-Z0-9]*-]?)"存在两个问题:
- 语法错误:嵌套方括号
[[A-Z0-9]*-]不符合正则规范,方括号内无需重复嵌套 - 逻辑缺陷:未明确区分无连字符的场景,导致无法匹配无连字符的批号
修正后的正则及Statistica代码
正则表达式
^([A-Z0-9]{3,})(?:-.*)|^([A-Z0-9]{3})(.*)
逻辑说明:
- 第一分支
^([A-Z0-9]{3,})(?:-.*):匹配带连字符的批号,捕获第一个连字符前≥3位的字母数字前缀,忽略后续内容 - 第二分支
^([A-Z0-9]{3})(.*):匹配无连字符的批号,捕获前3位字母数字,忽略后续内容
Statistica变量转换节点代码
TEST$[30]=RE_REPLACE(PRODUCED_LOT,"^([A-Z0-9]{3,})(?:-.*)|^([A-Z0-9]{3})(.*)",'$1$2',"c")
- 替换时使用
$1$2:两种场景只会有一个捕获组有内容,最终结果即为目标前缀 "c"参数表示匹配时区分大小写(根据你的批号格式保留该参数)
验证结果
RC219C0425→RC2AR4-23-QCT-001→AR4LC3B-18-TEK-015→LC3BS34353341-000022→S34353341
内容的提问来源于stack exchange,提问作者TiSaph
相关产品推荐
相关产品推荐

