在 Java 编程中,字符串处理是非常核心的基础技能,尤其在文本解析、数据提取场景中高频使用。今天我们通过一个经典的小案例 ——从购物小票文本中提取所有商品价格并计算总额,结合正则表达式StringTokenizer 字符串分割工具,手把手带你掌握文本数据提取的核心用法。

一、案例需求

给定一段购物小票文本: 牛奶:89.8 元,香肠:12.9 元 啤酒:69 元 巧克力:132 元 需要完成:

  1. 提取文本中所有商品的价格数字;
  2. 统计商品种类数量;
  3. 计算所有商品的价格总和。

二、核心知识点前置

在写代码前,我们先理清两个关键工具:

1. 正则表达式 [^0123456789.]

  • [^...]:匹配不在括号内的所有字符;
  • 这里匹配非数字、非小数点的所有字符(汉字、符号、空格等);
  • 配合 replaceAll() 方法,可以把非数字字符统一替换为分隔符。

2. StringTokenizer 字符串解析器

Java 用于按分隔符拆分字符串的工具类,核心方法:

  • new StringTokenizer(字符串, 分隔符):创建解析器;
  • countTokens():获取拆分后的单词(数据)总数;
  • hasMoreTokens():判断是否还有未解析的单词;
  • nextToken():获取下一个单词。

三、完整代码实现

我们直接完善题目模板,代码可直接运行:

import java.util.*;

public class FoundPrice {
    public static void main(String args[]) {
        // 原始购物小票文本
        String s="牛奶:89.8 元,香肠:12.9 元 啤酒:69 元 巧克力:132 元";
        // 正则:匹配所有非数字、非小数点的字符
        String regex="[^0123456789.]" ; 
        // 将非数字字符替换为 * 作为分隔符
        String digitMess=s.replaceAll(regex,"*");
        
        // 代码1:创建StringTokenizer,以*为分隔符解析字符串
        StringTokenizer fenxi=new StringTokenizer(digitMess,"*");
        // 代码2:获取解析后的价格数量(商品种类)
        int number=fenxi.countTokens();
        
        double sum=0;
        // 循环遍历所有价格
        while(fenxi.hasMoreTokens()) {
            // 代码3:获取下一个价格字符串
            String str=fenxi.nextToken();
            System.out.println(str);
            // 字符串转double,累加总价
            sum=sum+Double.parseDouble(str);
        }
        
        System.out.println("购物小票中的商品种类:"+number+"种");
        System.out.println("购物小票中的价格总额:"+sum+"元");
    }
}

代码填空答案

  • 【代码 1】:new StringTokenizer(digitMess,"*");
  • 【代码 2】:fenxi.countTokens();
  • 【代码 3】:fenxi.nextToken();

四、代码执行流程详解

  1. 正则替换:用 replaceAll 把文本中所有汉字、符号、空格替换为 *,最终 digitMess 结果为:***89.8***12.9***69***132**
  2. 字符串分割StringTokenizer* 为分隔符,拆分出纯价格字符串:89.812.969132
  3. 统计与计算:通过 countTokens() 得到商品数量,循环遍历价格字符串并累加求和。

五、运行结果

89.8
12.9
69
132
购物小票中的商品种类:4种
购物小票中的价格总额:303.7元

六、知识点总结

  1. 正则表达式提取数字[^0-9.] 是提取数字的常用正则,快速过滤无关字符;
  2. StringTokenizer 用法:适合简单的字符串分割,比 split() 更轻量高效;
  3. 字符串转数值Double.parseDouble() 将数字字符串转为浮点型,用于数值计算;
  4. 文本解析思路清洗数据(替换无关字符)→ 分割数据 → 遍历处理,是文本处理的通用逻辑。

七、拓展优化

我们可以简化正则表达式([^0-9.][^0123456789.] 效果完全一致,更简洁):

String regex="[^0-9.]" ; 

更多推荐