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++
您可以添加与任何字符串匹配的替代项,
.*(\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+ 个字符之后。.*模式末尾的 与该行的其余部分相匹配。