如果模式不匹配,则正则表达式返回完整字符串

时间:2018-01-03 23:29:04

标签: regex

我需要一个正则表达式来解释产品条形码中的数据。

以下适用于我的用例:

(\w+)\^\^(\w+)\^(\w+)

带有示例条形码

PRODID^^BATCH^EXP 

将这三个元素作为单独的组返回。

我想要的是提供的条形码不是A^^B^C格式,然后整个字符串作为第一组返回。

2 个答案:

答案 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+).*?|(.+)()())$

https://regex101.com/r/mFoOdW/4