我需要一个正则表达式来解释产品条形码中的数据。
以下适用于我的用例:
(\w+)\^\^(\w+)\^(\w+)
带有示例条形码
PRODID^^BATCH^EXP
将这三个元素作为单独的组返回。
我想要的是提供的条形码不是A^^B^C
格式,然后整个字符串作为第一组返回。
答案 0 :(得分:3)
这是我对它的看法..
^((?=\w+\^\^\w+\^\w+)\w+|.*)(?:\^\^(\w+)\^(\w+))?
第1组使用正向前瞻来查看您的a^^b^c
格式是否匹配,并回退到只匹配所有格式。同时,额外的^^b^c
内容被包装在非捕获组中并且是可选的。
演示(感谢@Barmar!)https://regex101.com/r/tI7QV2/2
"a^^b^c"
Full match 0-6 `a^^b^c`
Group 1. 0-1 `a`
Group 2. 3-4 `b`
Group 3. 5-6 `c`
"abc"
Full match 0-3 `abc`
Group 1. 0-3 `abc`
答案 1 :(得分:2)
逻辑选择是使用分支重置
(?m)^(?|(\w+)\^\^(\w+)\^(\w+)|(.+)()())$
https://regex101.com/r/mFoOdW/3
解释:
# Barcode regex
# -----------------------
(?m) # Multi-line mode
^ # Beginning of line
(?| # Branch reset
( \w+ ) # (1), Element 1
\^\^
( \w+ ) # (2), Element 2
\^
( \w+ ) # (3), Element 3
| # or,
( .+ ) # (1), Entire line
( ) # (2), empty
( ) # (3), empty
)
$ # End of line
如果您希望在元素之前/之后选择填充字符,
您可以使用此修改代替它。
(?m)^(?|.*?(\w+)\^\^(\w+)\^(\w+).*?|(.+)()())$