preg_match_all正则匹配不完整 末尾小数位未捕获问题排查
问题根因
你使用的U(非贪婪)修饰符会反转所有正则量词的匹配逻辑,所有{m,n}、+、*量词都会优先匹配满足最小长度的内容。你规则中最后两个数字分组写的是[0-9\.,]{4,8},在非贪婪模式下只要匹配到4个符合要求的字符就会停止,所以无法完整捕获带小数点的数值。
解决方案
方案一(更推荐,稳定性更高)
- 移除正则末尾的
U修饰符,关闭全局非贪婪匹配 - 将第四组过于宽泛的
.{5,}替换为匹配实际业务字符的规则,比如你的场景里第四组是纯字母商品名,可写成[A-Za-z]{5,},如果允许包含空格可调整为[A-Za-z ]{5,},避免通配符贪婪吞噬后面的数字内容
调整后正则:/([0-9]{6,}) ([0-9]{10,}) ([0-9]{4,5}) ([A-Za-z]{5,}) ([0-9]{1,}) ([0-9\.,]{4,8}) ([0-9\.,]{4,8})/g
方案二(如需保留U修饰符)
给最后两个数字分组的量词额外添加?,在全局非贪婪模式下将这两个分组的匹配逻辑改回贪婪模式即可。
调整后正则:/([0-9]{6,}) ([0-9]{10,}) ([0-9]{4,5}) (.{5,}) ([0-9]{1,}) ([0-9\.,]{4,8}?) ([0-9\.,]{4,8}?)/gU
内容的提问来源于stack exchange,提问作者Daniel Williams
相关产品推荐
相关产品推荐

