我为药房开发软件,以验证NMVS中的药物。该程序应该以这样的方式工作,我用手持扫描仪扫描药物代码,单击“验证”并连接到NMVS。大部分工作已经完成,但要正确验证药物,我需要从GTIN代码(PC)、批号(LoT)、序列号(SN)和有效期(EXP)中提取
以下是测试药物的扫描结果:
01059099913808231003ZP082117230831210XXFAE5AWA6RF8
0105909990054152101123926172207012162RB6FBN09
010590999109968821100322567773831721093010100013978
01059099907954202190EPCNT32ZH5581004032217250331
010590999032841321YCK3EB53CNZXD1725083110C48700
0105909990071029211165895472021010MU465417241031
我知道它是GS1 DataMatrix,GTIN前缀为01(后面14位数字是GTIN),LoT前缀为10(后面1-20个字母数字字符是LoT),SN前缀为21(后面1-20个字母数字字符是LoT),失效日期前缀为17(后面6位数字是EXP)。
对于给定的例子,我应该有例如:
[
{
"gtin": "05909991380823",
"lot": "03ZP08",
"sn": "0XXFAE5AWA6RF8",
"exp": "230831"
},
{
"gtin": "05909990054152",
"lot": "1123926",
"sn": "62RB6FBN09",
"exp": "220701"
},
{
"gtin": "05909991099688",
"lot": "100013978",
"sn": "10032256777383",
"exp": "210930"
},
{
"gtin": "05909990795420",
"lot": "040322",
"sn": "90EPCNT32ZH558",
"exp": "250331"
},
{
"gtin": "05909990328413",
"lot": "C48700",
"sn": "YCK3EB53CNZXD",
"exp": "250831"
},
{
"gtin": "05909990071029",
"lot": "10MU4654",
"sn": "116589547202",
"exp": "241031"
}
]
问题是这些部分可以是任何顺序和不同的长度。只有GTIN和EXP具有固定长度。
我创建了一个正则表达式来提取这些部分:^(?=.*01(\d{14}))(?=.*10([a-zA-Z0-9]{1,20}))(? =.*17(\d{6}))(?=.*21([a-zA-Z0-9]{1,20})).*$
但不幸的是它不能正常工作。客户端是用JavaScript编写的(不是TS,确切地说是AngularJS --是的,这是一个遗留项目,我正试图说服公司更新它),服务器是用Java编写的。
我正在寻找任何解决方案-无论是正则表达式,库(JavaScript或Java),外部API -对于这个问题,我个人已经没有想法了。
此外,我还要补充一点,我使用的手持式扫描仪是Zebra DS 2208。
我将感谢任何关于这个主题的帮助。
编辑:
我尝试读取条形码扫描仪输出字符的字符,但我没有看到一个模式。这是我得到的
1条答案
按热度按时间kokeuurv1#
我做到了!我注意到GTIN和EXP总是以正确的方式提取,所以我尝试了这样的东西:
我认为无论如何都可以优化,但现在我不在乎;).
这是怎么回事?
1.在
extractDataMatrix
中,我检查固定长度的前缀(GTIN和EX)。1.在
forEach
之后,我从responseCode
中删除它。1.我将这个
responseCode
传递给extractLotAndSn()
函数。1.在这个函数中,我使用正则表达式来获取lot和sn。
1.有时我得到代码,其中前缀是前一个序列的一部分(例如。1010和2121),所以
checkLotAndSn()
函数从序列的开始删除前缀并将其添加到前一个序列。1.我不知道为什么在
10100
和21210
是responseCode
的一部分的情况下,所有内容都被正确分割,所以我将其从交换中排除。