regex Preg_match / split条形码

yizd12fk  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(188)

我正在阅读一个GS1-128条形码,并试图将其分割成它所包含的片段,这样我就可以自动填写一张表格。
但是我想不出来,扫描我的条形码得到了以下信息:]编号2010年7月20日
所以我尝试从preg_match开始,并做了以下操作:

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

这给了我这个结果:

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

“我是一个人,我是一个人,我是一个人,我是一个人,我是一个人。
最后,这是我想要的结果(没有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 and RegEx但是我想不出来。
有人能帮我吗

fslejnso

fslejnso1#

这个正则表达式应该可以做你想要的事情(注意,为了清楚起见,我把它分成了几行,你可以像这样用x(extended)标志来使用它,或者把它转换回一行):

^]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组中捕获)
  • 使用生产线末端$完成

注意,我们需要使用tempered greedy tokens来避免1021代码可能吞下下面的代码(如下面regex演示中的第二个示例)。
Demo on 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
        )

)

www.example.com上的演示3v4l.org

wlzqhblo

wlzqhblo2#

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

你可以试试这样的。
查看演示
https://regex101.com/r/Bw238X/1

相关问题