PHP正则表达式问题:匹配价格时排除末尾带百分号的内容
解决Tesseract识别文本中精准匹配价格、排除税额的正则问题
问题分析
你当前的正则表达式/\d+[\d \]\/\|o,\'.]*\s*/i范围太宽泛,它会匹配任何数字开头且后续跟着指定字符的序列,所以误命中了带百分号的税额7.7。我们需要调整正则规则,明确区分独立价格和末尾带百分号的税额,同时兼容Tesseract可能出现的识别误差(比如数字间多余的空格)。
解决方案
使用以下正则表达式可以精准匹配目标价格5'067.00,同时自动排除带百分号的税额:
$regex = "/(?<!\\d)\\d+(?:['.]\\d+)*\\b(?!\\s*%)/i";
正则规则拆解
逐个部分解释这个正则的作用:
(?<!\d):负向零宽断言,确保匹配的数值前面不是数字,避免从长数字串中截取片段;\d+:匹配价格开头的整数部分;(?:['.]\d+)*:非捕获组,匹配价格的千分位分隔符(单引号')或小数点(.)及后续数字,*表示该部分可重复(支持1'234.56这类多千分位的格式);\b:单词边界,确保匹配的是完整的数值,而非更长字符的一部分;(?!\s*%):负向零宽断言,确保数值后面没有跟着可选空格加百分号%,直接排除税额类数值。
测试验证
将这个正则应用到你的识别文本( Preis inkl. 7. 7 % MWST ist 5'067.00)上,会精准匹配到5'067.00,而7. 7因为后续跟着%会被自动排除,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Maisen1886
相关产品推荐
相关产品推荐

