我目前正在尝试使用正则表达式分解二维条形码,以便在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
如果你对此有任何问题,请告诉我。