Java 实战:正则 + StringTokenizer 解析购物小票价格
·
在 Java 编程中,字符串处理是非常核心的基础技能,尤其在文本解析、数据提取场景中高频使用。今天我们通过一个经典的小案例 ——从购物小票文本中提取所有商品价格并计算总额,结合正则表达式和StringTokenizer 字符串分割工具,手把手带你掌握文本数据提取的核心用法。
一、案例需求
给定一段购物小票文本: 牛奶:89.8 元,香肠:12.9 元 啤酒:69 元 巧克力:132 元 需要完成:
- 提取文本中所有商品的价格数字;
- 统计商品种类数量;
- 计算所有商品的价格总和。
二、核心知识点前置
在写代码前,我们先理清两个关键工具:
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();
四、代码执行流程详解
- 正则替换:用
replaceAll把文本中所有汉字、符号、空格替换为*,最终digitMess结果为:***89.8***12.9***69***132**; - 字符串分割:
StringTokenizer以*为分隔符,拆分出纯价格字符串:89.8、12.9、69、132; - 统计与计算:通过
countTokens()得到商品数量,循环遍历价格字符串并累加求和。
五、运行结果
89.8
12.9
69
132
购物小票中的商品种类:4种
购物小票中的价格总额:303.7元
六、知识点总结
- 正则表达式提取数字:
[^0-9.]是提取数字的常用正则,快速过滤无关字符; - StringTokenizer 用法:适合简单的字符串分割,比
split()更轻量高效; - 字符串转数值:
Double.parseDouble()将数字字符串转为浮点型,用于数值计算; - 文本解析思路:清洗数据(替换无关字符)→ 分割数据 → 遍历处理,是文本处理的通用逻辑。
七、拓展优化
我们可以简化正则表达式([^0-9.] 和 [^0123456789.] 效果完全一致,更简洁):
String regex="[^0-9.]" ;
更多推荐

所有评论(0)