You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:24:12