正则表达式替换功能:在不匹配的情况下,$ 1返回整行而不是null

时间:2018-11-02 13:20:03

标签: regex regex-group regexp-replace

测试链接: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 ++

1 个答案:

答案 0 :(得分:3)

您可以添加与任何字符串匹配的替代项

.*(\d{13}).*|.*

问题在于,首先尝试第一个替代方法,并且如果一行上有连续的13位数字,则该替代方法将“获胜”,而.*将不会触发。 $1将保留13位数字。参见regex demo

或者,可选的非捕获组和强制数字捕获组:

(?:.*(\d{13}))?.*

请参见regex demo

在这里,(?:.*(\d{13}))?将至少执行一次(因为?是一个匹配1或0次的贪婪量词),它将找到13位数字并将它们放置在组0后面的其他1个字符之后比换行符。模式结尾处的.*将与该行的其余部分匹配。