使用正则表达式对FMD条形码进行解码



我目前正在尝试使用正则表达式分解二维条形码,以便在c#系统中对药品进行FMD检查。数据矩阵条形码中使用的条形码。

我是正则表达式的新手,没有使用它们的经验,但我得到了一个片段

我遇到的问题是,条形码的详细信息可以按以下格式的任何顺序排列:

  • 01=GTIN编号(固定的14位数字(
  • 10=批号(可变长度,最多20个字符,或用x1d分隔(
  • 17=有效期(固定的6位YYYMMDD(
  • 21=序列号(可变长度,最多20个字符,或用x1d分隔(

在完美的世界里,我们会按照这个顺序得到这些,但事实并非总是如此。

当按照上述顺序时,我们可以使用以下正则表达式:

01(d{14})10([a-zA-Z0-9]{1,20})(\x1d)?17(d{6})21([a-zA-Z0-9]{1,20})(\x1d)?

例如;https://regex101.com/r/e5cpla/1

然而,当以任何顺序尝试时,我似乎都无法获得识别其中价值观的表达式。我尝试了以下操作,但没有得到预期的结果。

(?=.*01(d{14}))(?=.*10([a-zA-Z0-9]{1,20}))(?=.*(\x1d)?)(?=.*17(d{6}))(?=.*21([a-zA-Z0-9]{1,20}))(?=.*(\x1d)?).*$

有人知道我们该怎么做吗?

你非常接近终点!

(?:01(d{14})|10([a-zA-Z0-9]{1,20})(\x1d)?|17(d{6})|21([a-zA-Z0-9]{1,20})(\x1d)?)

只需在您的表达式周围添加一个非捕获组,并用|分隔所有捕获组,我们就可以得到一个表达式,它将以任何顺序计算结果!

不过,这里有一个警告:因为非捕获组一次捕获其中一个元素,所以其中只有一个捕获组包含任何数据,其他捕获组都是空的,所以必须编写几行代码来说明这一点。

这是您更新的示例,您可以看到我对替换中的空捕获组的意思。但如果你分别处理每一场比赛,只看捕捉到一些东西的捕捉组,你就没事了!

https://regex101.com/r/e5cpla/2

如果你对此有任何问题,请告诉我。

最新更新