测试链接:regexr.com/42d9c
这让我发疯了。
我要在下面的行中提取条形码:
Ceres Juice Apricot 12 x 1lt unit: 6001240102022
Ceres Juice Cranberry& Kiwi Juice 12 x 1lt... unit:
Ceres Juice Guava 12 x 1lt.. unit:6001240222829
Ceres Juice Orange 12x1lt... unit:
Ceres Juice Medley of Fruits 1L x 12 unit: 6001240100660
它应该返回:
6001240102022
6001240222829
6001240100660
我正确使用了.*(\d{13}).*
然后我用$1
返回第一个匹配项
但是我的结果看起来像这样:
6001240102022
Ceres Juice Cranberry& Kiwi Juice 12 x 1lt... unit:
6001240222829
Ceres Juice Orange 12x1lt... unit:
6001240100660
原因:
此问题的原因是,如果匹配组($ 1)中没有任何内容,则'Replace'返回原始字符串。
解决方法:
确保每行上都有一个“ match”,并将其放入Match Group 1($ 1)。然后将您的实际匹配项放入“匹配项2”($ 2)。该怎么做?
语言/平台:
任何。我已经尝试了所有在线Regex网站以及Notepad ++
答案 0 :(得分:3)
您可以添加与任何字符串匹配的替代项
.*(\d{13}).*|.*
问题在于,首先尝试第一个替代方法,并且如果一行上有连续的13位数字,则该替代方法将“获胜”,而.*
将不会触发。 $1
将保留13位数字。参见regex demo。
或者,可选的非捕获组和强制数字捕获组:
(?:.*(\d{13}))?.*
请参见regex demo
在这里,(?:.*(\d{13}))?
将至少执行一次(因为?
是一个匹配1或0次的贪婪量词),它将找到13位数字并将它们放置在组0后面的其他1个字符之后比换行符。模式结尾处的.*
将与该行的其余部分匹配。