正则表达式替换函数:如果不匹配,$1 返回整行而不是 null

Ric*_*olf 4 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
Run Code Online (Sandbox Code Playgroud)

它应该返回:

6001240102022

6001240222829

6001240100660
Run Code Online (Sandbox Code Playgroud)

我正确使用.*(\d{13}).*

然后我用$1它返回第一个匹配项

但我的结果看起来像这样:

6001240102022
Ceres Juice Cranberry& Kiwi Juice 12 x 1lt... unit:
6001240222829
Ceres Juice Orange 12x1lt... unit:
6001240100660
Run Code Online (Sandbox Code Playgroud)

原因:

造成此问题的原因是,如果匹配组 ($1) 中没有任何内容,则“替换”将返回原始字符串。

解决方法:

确保每行都有一个“匹配”,并将其放入匹配组 1 ($1)。然后将您的实际比赛放入比赛组 2 ($2)。这个怎么做?

语言/平台:

任何。我已经尝试过所有在线正则表达式网站以及 Notepad++

Wik*_*żew 6

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

.*(\d{13}).*|.*
Run Code Online (Sandbox Code Playgroud)

要点是,首先尝试第一个替代方案,如果一行中有 13 个连续数字,则替代方案将“获胜”并且.*不会触发。$1然后将保存 13 位数字。请参阅正则表达式演示

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

(?:.*(\d{13}))?.*
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

在这里,(?:.*(\d{13}))?将至少执行一次(就像?匹配 1 或 0 次的贪婪量词一样),并将找到 13 个数字并将它们放入第 1 组中除换行符之外的任何 0+ 个字符之后。.*模式末尾的 与该行的其余部分相匹配。