预匹配/拆分条形码(_M)



我正在努力阅读GS1-128条形码,并试图将其拆分为包含的部分,这样我就可以自动填写表格了。

但我想不通。扫描我的条形码会得到以下信息:]d2010704626096200210KT0BT2204[GS]17260900021RNM5F8TMBHZSY7

所以我试着从preg_match开始,并做了以下操作:

/]d2[01]{2}d{14}[10|17|21]{2}(w+)/

这给了我这样的结果:

Array ( [0] => ]d2010704626096200210KT0BT2204 [1] => KT0BT2204 )

现在[1]实际上是正确的,男人[0]不是,所以我撞到了墙上。

最后,这是我想要的结果(没有01,10,17,21(:

(01) 07046260962002
(10) KT0BT2204
(17) 60900
(21) RNM5F8CTMMBHZSY7
01 - Always 14 chars after
17 - Always 6 chars after
10 can be up to 20 chars, but always has end delimiter <GS> - But if barcode ends with 10 <GS> is not present
21 can be up to 20 chars, but always has end delimiter <GS> - But if barcode ends with 21 <GS> is not present

我试着回答这个问题:GS1-128和RegEx但我想不通。

有谁能帮我吗?

这个正则表达式应该可以执行您想要的操作(请注意,为了清晰起见,我将其拆分为单独的行,您可以像这样将其与x(扩展(标志一起使用,也可以将其转换回一行(:

^]d2(?:
01(?P<g01>.{14})|
10(?P<g10>(?:(?![GS]).){1,20})(?:[GS]|$)|
17(?P<g17>.{6})|
21(?P<g21>(?:(?![GS]).){1,20})(?:[GS]|$)
)+$

它在寻找

  • ^的开头,后面跟着文字]d2,然后是
  • 01后面跟着14个字符(在g01组中捕获(
  • 10后面最多20个字符,以[GS]或行尾结尾(在组g10中捕获(
  • 17后面跟着6个字符(在g17组中捕获(
  • 21后面最多20个字符,以[GS]或行尾结尾(在组g21中捕获(
  • 以线路末端$完成

请注意,我们需要使用回火贪婪令牌来避免1021代码可能吞下以下代码的情况(如下面regex演示中的第二个示例(。

regex101 演示

在PHP中:

$barcode = ']d201070462608682672140097289158930[GS]10101656[GS]17261130';
preg_match_all('/^]d2(?:
01(?P<g01>.{14})|
10(?P<g10>(?:(?![GS]).){1,20})(?:[GS]|$)|
17(?P<g17>.{6})|
21(?P<g21>(?:(?![GS]).){1,20})(?:[GS]|$)
)+$/x', $barcode, $matches);
print_r($matches);

输出:

Array
(
[0] => Array
(
[0] => ]d201070462608682672140097289158930[GS]10101656[GS]17261130
)
[g01] => Array
(
[0] => 07046260868267
)
[1] => Array
(
[0] => 07046260868267
)
[g10] => Array
(
[0] => 101656
)
[2] => Array
(
[0] => 101656
)
[g17] => Array
(
[0] => 261130
)
[3] => Array
(
[0] => 261130
)
[g21] => Array
(
[0] => 40097289158930
)
[4] => Array
(
[0] => 40097289158930
)
)

3v4l.org 上的演示

]d2[01]{2}(d{14})(?:10|17|21)(w+)[GS](w+)(?:10|17|21)(w+)

你可以试试这样的东西。

请参阅演示。。

https://regex101.com/r/Bw238X/1

最新更新