Java正则如何匹配字符串中首个出现的商品价格模式
问题说明
- 待处理数据为多条产品描述字符串,部分字符串仅包含实际产品价格,部分额外标注了配送、安装等附加费用
- 提取规则:实际产品价格固定为字符串中出现的第一个价格,即第一个
.-符号前紧邻的数字,需要过滤所有后续附加费用相关价格 - 之前尝试使用带惰性运算符的正则
\d+(?=(\.-)).*?实现首次匹配即停止,未达到预期效果 - 代码运行环境为Java
测试样例
待处理的原始字符串如下:
2-TB SSD, black, 200.- EUR + Extra Costs. Tel. 1234/12345678 oder Tel. 1234/12345678 PC, white case, 320.- price + 62.- delivery + 95.- setup PC, black case, 320.- price + 62.- delivery + 95.- setup 2-TB SSD, white, 200.- EUR, Tel. 1234/12345678 oder Tel. 1234/12345678
预期提取结果依次为:200、320、320、200
实现方案
原有正则问题
原正则末尾的.*?会匹配价格数字之后的所有字符,且没有利用Java正则匹配API本身的顺序查找特性,导致返回多余内容。
可用正则
直接使用(\d+)\.-即可,规则为捕获连续数字,且该数字后必须紧邻.-字符,不需要额外添加惰性匹配逻辑。
Java代码实现
import java.util.regex.Matcher; import java.util.regex.Pattern; public class ProductPriceParser { private static final Pattern PRICE_PATTERN = Pattern.compile("(\\d+)\\.-"); public static String getActualProductPrice(String productDesc) { Matcher matcher = PRICE_PATTERN.matcher(productDesc); // find()方法从字符串左向右查找,默认返回第一个命中的匹配项 if (matcher.find()) { return matcher.group(1); } // 无匹配场景可根据业务需求调整返回值,比如抛异常、返回null return null; } public static void main(String[] args) { String[] testList = { "2-TB SSD, black, 200.- EUR + Extra Costs. Tel. 1234/12345678 oder Tel. 1234/12345678", "PC, white case, 320.- price + 62.- delivery + 95.- setup", "PC, black case, 320.- price + 62.- delivery + 95.- setup", "2-TB SSD, white, 200.- EUR, Tel. 1234/12345678 oder Tel. 1234/12345678" }; for (String desc : testList) { System.out.println(getActualProductPrice(desc)); } } }
运行main方法可直接得到预期的四个价格结果。
提示:Java字符串中编写正则时,反斜杠需要做转义处理,因此数字匹配符要写为\\d而非\d。
内容的提问来源于stack exchange,提问作者lucas
相关产品推荐
相关产品推荐

