求助:如何用正则表达式拆分GS1-128条码以自动填充表单
解决GS1-128条码拆分问题
问题分析
你扫描得到的GS1-128条码内容为:
]d2010704626096200210KT0BT2204[GS]1726090021RNM5F8CTMMBHZSY7
其中[GS]是ASCII控制字符组分隔符(GS,ASCII码29,十六进制\x1D),需先转换为实际字符再处理。之前的正则仅匹配部分内容,未覆盖所有AI段,也未正确处理分隔符规则。
正确正则方案
针对各AI的规则,编写正则表达式匹配所有AI及对应内容:
]d2(?:01(\d{14})|10([\w]{1,20})(?=\x1D|$)|17(\d{6})|21([\w]{1,20})(?=\x1D|$))+
正则各部分说明
]d2:匹配GS1-128条码的前缀标识(?:...):非捕获组,用于包裹多个AI的匹配规则,避免额外捕获01(\d{14}):匹配AI01,捕获其后固定14位数字10([\w]{1,20})(?=\x1D|$):匹配AI10,捕获1-20位字符,直到GS分隔符或条码结尾17(\d{6}):匹配AI17,捕获其后固定6位数字21([\w]{1,20})(?=\x1D|$):匹配AI21,捕获1-20位字符,直到GS分隔符或条码结尾+:重复匹配所有连续的AI段
PHP代码实现
将条码中的[GS]替换为实际的GS字符,再用正则提取内容:
// 替换占位符为实际GS字符 $barcode = str_replace('[GS]', "\x1D", ']d2010704626096200210KT0BT2204[GS]1726090021RNM5F8CTMMBHZSY7'); // 正则表达式 $pattern = '/]d2(?:01(\d{14})|10([\w]{1,20})(?=\x1D|$)|17(\d{6})|21([\w]{1,20})(?=\x1D|$))+/'; // 执行匹配 preg_match_all($pattern, $barcode, $matches); // 整理结果 $parsedData = [ '01' => $matches[1][0], '10' => $matches[2][0], '17' => $matches[3][0], '21' => $matches[4][0] ]; // 输出结果 print_r($parsedData);
输出结果
执行后将得到符合预期的拆分结果:
Array ( [01] => 07046260962002 [10] => KT0BT2204 [17] => 260900 [21] => RNM5F8CTMMBHZSY7 )
之前正则的问题
你之前的正则/]d2[01]{2}\d{14}[10|17|21]{2}(\w+)/存在以下问题:
[01]{2}是字符组匹配,会匹配00/11等无效AI,而非固定的01[10|17|21]{2}是字符组,仅匹配单个字符的组合(如10/17但也会匹配01/72等),而非完整的AI码- 未处理GS分隔符,也未支持多AI段匹配,只能捕获单一内容
内容的提问来源于stack exchange,提问作者MauiRiis
相关产品推荐
相关产品推荐

