Regex 正则表达式替换函数:在不匹配的情况下,$1返回整行,而不是null
测试链接: 这让我快发疯了 我想提取以下行中的条形码:Regex 正则表达式替换函数:在不匹配的情况下,$1返回整行,而不是null,regex,regex-group,regexp-replace,Regex,Regex Group,Regexp Replace,测试链接: 这让我快发疯了 我想提取以下行中的条形码: 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
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”返回原始字符串
解决方法:
确保每一行上都有一个“匹配项”,并将其放入匹配组1($1)。然后把你真正的对手放入第二组(2美元)。如何做到这一点
语言/平台:
任何。我已经尝试了所有在线正则表达式网站和记事本++您可以添加一个匹配任何字符串的替代项
.*(\d{13}).*|.*
关键是首先尝试第一个备选方案,如果一行中有13个连续数字,则备选方案将“获胜”,并且*
不会触发<代码>$1将保留13位数字。看
或者,可选的非捕获组和强制数字捕获组:
(?:.*(\d{13}))?.*
见
在这里,
(?:.*(\d{13}))?
将至少执行一次(因为?
是一个贪婪的量词,匹配1或0次),并将找到13位数字,并将它们放在除换行符以外的任何0+字符之后的组1中。模式末尾的*
将与行的其余部分匹配。添加一个与任何字符串匹配的替代项,*(\d{13})。*.*.*
。或者,使用(?:.*(\d{13}))?.*
一个快速测试表明它是有效的:*(\d{13})。*|.*
还不知道怎么做><但是谢谢!我已经努力解决这个问题大约3个小时了。非常感谢Wiktor。你让我摆脱了痛苦:)我在这里学到了一些有用的东西。但是,我想知道您的术语是否是100%,因为我认为从技术上讲,您的解决方案会导致每行匹配(而不仅仅是组!),而我的解决方案不是:我的解决方案甚至无法在某些行上“匹配”。你也可以在没有“第二组”的情况下谈论“第二组”。尽管如此,我还是非常高兴并感谢你的帮助。谢谢大家!@理查德伍尔夫当然,只有第1组,我在解释中修正了这一部分。匹配,是的,但是这里有一个捕获组,当一个模式与字符串的某个部分匹配时,我使用动词“捕获”;当我在你的帮助之前尝试这一点时,我认为这是不可能的——我认为非捕获部分优于/拥有对内部组的权限。