You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用正则表达式拆分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}):匹配AI 01,捕获其后固定14位数字
  • 10([\w]{1,20})(?=\x1D|$):匹配AI 10,捕获1-20位字符,直到GS分隔符或条码结尾
  • 17(\d{6}):匹配AI 17,捕获其后固定6位数字
  • 21([\w]{1,20})(?=\x1D|$):匹配AI 21,捕获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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:06:51