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

Regex Replace function: in cases of no match, $1 returns full line instead of null

测试link: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

应该return:

6001240102022

6001240222829

6001240100660

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

然后我使用 </code> 来 return 第一场比赛 </p> <p>但我的结果是这样的:</p> <pre><code>6001240102022 Ceres Juice Cranberry& Kiwi Juice 12 x 1lt... unit: 6001240222829 Ceres Juice Orange 12x1lt... unit: 6001240100660

原因:

这个问题的原因是'Replace' return如果匹配组($1)中没有任何内容,那么就是原始字符串。

解决方法:

确保每一行都有一个 'match',并将其放入匹配组 1 ($1)。然后将您的实际比赛放入比赛组 2($2)。如何做到这一点?

Language/Platform:

任何。我已经尝试了所有在线 Regex 网站以及 Notepad++

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

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

重点是第一个选择先试,如果一行有13个连续数字,选择"win",.*不会触发。 </code> 将保留 13 位数字。见 <a href="https://regex101.com/r/32y4RP/2" rel="nofollow noreferrer">regex demo</a>.</p> <p>或者,可选的非捕获组与强制数字捕获组:</p> <pre><code>(?:.*(\d{13}))?.*

regex demo

这里,(?:.*(\d{13}))?会至少执行一次(因为?是匹配1次或0次的贪心量词),会找出13个数字放在任意0+之后的第1组换行字符以外的字符。模式末尾的 .* 将匹配该行的其余部分。