4

私は 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 - GTIN
  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 とグループ化されないようにしながら、AI 30 をオプションにするにはどうすればよいですか?

テストケース:

(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 の開始位置を示すためだけのものであり、バーコード自体はこれらを省略していることに注意してください。

4

3 に答える 3

2

これを試して:

^(?<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})?)$
于 2013-07-01T11:14:40.707 に答える
0

これを試してみてください。これにより、すべてのセグメントの一致グループが得られます。(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 の条件を満たしているかどうかを確認できます。

于 2020-02-25T08:51:34.773 に答える