gpt4 book ai didi

c# - GS1-128 和正则表达式

转载 作者:行者123 更新时间:2023-11-30 12:10:43 25 4
gpt4 key购买 nike

我正忙于 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,将其分成以下组:

  1. 01 - 全局贸易项目代码
  2. 12345678 - 公司代码(虚拟)- 8 位数字
  3. 12345 - 零件代码(虚拟)- 5 位数字
  4. 11 或 17 - 生产日期/有效期
  5. 130500 - 日期 - 6 位数字
  6. 10 或 21 - 批号/序列号
  7. 1234567890 - 1 到 20 个字符
  8. 30 - 项目数(可选)
  9. 42 - 1 到 8 个字符(可选)

现在,有时我的条形码没有元素计数 AI; 30. 我似乎完全想不出如何将它应用到我的正则表达式中。每当我将第 8 组和第 9 组设为可选时,对于所有确实包含 AI 30 的条码,这些组的内容都会被放入第 7 组。

我如何才能使 AI 30 成为可选的同时防止它与 AI 21/10 归为一组?

测试用例:

(01)12345678654320(11)120500(21)1234567890 应给出以下匹配项:

  1. 01
  2. 12345678
  3. 65432
  4. 11
  5. 120500
  6. 21
  7. 1234567890
  8. 不匹配
  9. 不匹配

(01)12345678124570(17)130700(10)30567(30)50 应该给出以下匹配项:

  1. 01
  2. 12345678
  3. 12457
  4. 17
  5. 130700
  6. 10
  7. 30567
  8. 30
  9. 50

(01)12345678888880(11)140200(21)66503042(30)100 应该给出以下匹配项:

  1. 01
  2. 12345678
  3. 88888
  4. 11
  5. 140200
  6. 21
  7. 66503042
  8. 30
  9. 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) «$»
-->

编辑

省略转义括号:

^(?<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})?)$

关于c# - GS1-128 和正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17401909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com