我正忙于GS1-128,希望使用RegEx匹配扫描的条形码。我目前有以下表达式:
^(01)(12345678)(d{5})d(11|17)(d{2}[0-1]d[0-3]d)(10|21)(d{1,20})(30)(d{1,20})
这成功地匹配了条形码(01)12345678123450(11)130500(21)1234567890(30)42
,将其分为以下组:
- 01-GTIN
- 12345678-公司代码(伪)-8位数字
- 12345-零件代码(伪)-5位数字
- 11或17-生产日期/有效期
- 130500-日期-6位数字
- 10或21-批次/序列号
- 1234567890-1到20个字符
- 30-项目计数(可选)
- 42-1到8个字符(可选)
现在,我有时有一个条形码,里面没有AI项目的计数;30.我似乎根本不知道如何将其应用到我的正则表达式中。每当我进入第8组&9可选,对于do包含AI 30的所有条形码,这些组的内容被放入组7。
如何使AI 30可选,同时防止其与AI 21/10分组
测试用例:
(01)12345678654320(11)120500(21)1234567890
应给出以下匹配项:
- 01
- 12345678
- 65432
- 11
- 120500
- 21
- 1234567890
- 没有匹配
- 没有匹配
(01)12345678124570(17)130700(10)30567(30)50
应给出以下匹配项:
- 01
- 12345678
- 12457
- 17
- 130700
- 10
- 30567
- 30
- 50
(01)12345678888880(11)140200(21)66503042(30)100
应给出以下匹配项:
- 01
- 12345678
- 88888
- 11
- 140200
- 21
- 66503042
- 30
- 100
请注意,括号仅用于显示AI的起始位置,条形码本身省略了这些内容
试试这个:
^(?<gtin>(01))(?<comp_code>12345678)(?<part_code>d{5})0?(?<pd_ed>((?:11|17)))(?<date>d{6})(?<bat_no>((?:21|10)))(?<data_req>d{1,20}?)b(?<count>(?:(30))?)(?<data_opt>(?:d{1,8})?)$
上述表达式应与以下所有项目匹配:
(01)12345678654320(11)120500(21)1234567890
(01)12345678124570(17)130700(10)30567(30)50
(01)12345678888880(11)140200(21)66503042(30)100
说明:
<!--
^(?<gtin>(01))(?<comp_code>12345678)(?<part_code>d{5})0?(?<pd_ed>((?:11|17)))(?<date>d{6})(?<bat_no>((?:21|10)))(?<data_req>d{1,20}?)b(?<count>(?:(30))?)(?<data_opt>(?:d{1,8})?)$
Assert position at the beginning of the string «^»
Match the regular expression below and capture its match into backreference with name “gtin” «(?<gtin>(01))»
Match the character “(” literally «(»
Match the characters “01” literally «01»
Match the character “)” literally «)»
Match the regular expression below and capture its match into backreference with name “comp_code” «(?<comp_code>12345678)»
Match the characters “12345678” literally «12345678»
Match the regular expression below and capture its match into backreference with name “part_code” «(?<part_code>d{5})»
Match a single digit 0..9 «d{5}»
Exactly 5 times «{5}»
Match the character “0” literally «0?»
Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
Match the regular expression below and capture its match into backreference with name “pd_ed” «(?<pd_ed>((?:11|17)))»
Match the character “(” literally «(»
Match the regular expression below «(?:11|17)»
Match either the regular expression below (attempting the next alternative only if this one fails) «11»
Match the characters “11” literally «11»
Or match regular expression number 2 below (the entire group fails if this one fails to match) «17»
Match the characters “17” literally «17»
Match the character “)” literally «)»
Match the regular expression below and capture its match into backreference with name “date” «(?<date>d{6})»
Match a single digit 0..9 «d{6}»
Exactly 6 times «{6}»
Match the regular expression below and capture its match into backreference with name “bat_no” «(?<bat_no>((?:21|10)))»
Match the character “(” literally «(»
Match the regular expression below «(?:21|10)»
Match either the regular expression below (attempting the next alternative only if this one fails) «21»
Match the characters “21” literally «21»
Or match regular expression number 2 below (the entire group fails if this one fails to match) «10»
Match the characters “10” literally «10»
Match the character “)” literally «)»
Match the regular expression below and capture its match into backreference with name “data_req” «(?<data_req>d{1,20}?)»
Match a single digit 0..9 «d{1,20}?»
Between one and 20 times, as few times as possible, expanding as needed (lazy) «{1,20}?»
Assert position at a word boundary «b»
Match the regular expression below and capture its match into backreference with name “count” «(?<count>(?:(30))?)»
Match the regular expression below «(?:(30))?»
Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
Match the character “(” literally «(»
Match the characters “30” literally «30»
Match the character “)” literally «)»
Match the regular expression below and capture its match into backreference with name “data_opt” «(?<data_opt>(?:d{1,8})?)»
Match the regular expression below «(?:d{1,8})?»
Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
Match a single digit 0..9 «d{1,8}»
Between one and 8 times, as many times as possible, giving back as needed (greedy) «{1,8}»
Assert position at the end of the string (or before the line break at the end of the string, if any) «$»
-->
编辑
省略的转义parens:
^(?<gtin>01)(?<comp_code>12345678)(?<part_code>d{5})0?(?<pd_ed>(?:11|17))(?<date>d{6})(?<bat_no>(?:21|10))(?<data_req>d{1,20}?)b(?<count>(?:30)?)(?<data_opt>(?:d{1,8})?)$
可变长度AI应以FNC1字符结束。如果存在,您应该使用它来查找d{1,20}
的末尾。
如果它不存在,我会找出它在哪里被剥去的,并防止它被剥去。
试试这个,它可以匹配所有分段的组例如(3302)103300(10)L20060831A117,(02)04008577004106(15)081231(37)000025
(d{1,3}[0-9,a-z,A-Z]{1}?)[d,a-z,A-Z]{1,70}
之后你可以应用这个正则表达式吗
((.*?))
在每个片段上查找哪个AI具有代码部分然后你可以验证,如果代码部分符合他的AI的条件。