Android中使用Pattern类从短信文本提取指定数据的实现问题
用Pattern类提取短信指定数据的解决方案
嘿,我来帮你搞定这个正则提取的问题!先梳理下咱们要从这条固定格式的西班牙语短信里抓的核心信息:
- 收到的转账金额(比如
5.0 CUC) - 转账方的号码(比如
55391393) - 主账户余额(比如
1565.0 CUC) - 线路激活截止日期(比如
2019-02-10) - 账户到期日期(比如
2019-03-12)
第一步:编写精准匹配的正则表达式
因为短信格式是固定的,我们可以用捕获组来锁定每个目标值,正则表达式如下:
Usted ha recibido (\d+\.\d+) CUC del numero (\d+) .Saldo principal (\d+\.\d+) CUC, linea activa hasta (\d{4}-\d{2}-\d{2}), vence (\d{4}-\d{2}-\d{2})
正则各部分简单解释:
(\d+\.\d+):匹配带小数点的数字(比如金额、余额),括号包裹后会成为可提取的捕获组(\d+):匹配纯数字的手机号(\d{4}-\d{2}-\d{2}):精准匹配YYYY-MM-DD格式的日期
第二步:Android中Pattern&Matcher的代码实现
把这段逻辑加到你的BroadcastReceiver短信处理流程里就行:
import java.util.regex.Matcher; import java.util.regex.Pattern; // 假设这是你接收到的短信内容 String smsContent = "Usted ha recibido 5.0 CUC del numero 55391393 .Saldo principal 1565.0 CUC, linea activa hasta 2019-02-10, vence 2019-03-12"; // 定义正则(注意Java里要转义反斜杠) String regex = "Usted ha recibido (\\d+\\.\\d+) CUC del numero (\\d+) .Saldo principal (\\d+\\.\\d+) CUC, linea activa hasta (\\d{4}-\\d{2}-\\d{2}), vence (\\d{4}-\\d{2}-\\d{2})"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(smsContent); // 检查匹配结果并提取数据 if (matcher.find()) { // 捕获组索引从1开始,对应正则里的括号顺序 String receivedAmount = matcher.group(1); // 拿到5.0 String senderNumber = matcher.group(2); // 拿到55391393 String mainBalance = matcher.group(3); // 拿到1565.0 String activeUntil = matcher.group(4); // 拿到2019-02-10 String expireDate = matcher.group(5); // 拿到2019-03-12 // 这里替换成你的业务逻辑,比如存数据库、更新UI等 System.out.println("收到转账:" + receivedAmount + " CUC"); System.out.println("转账方号码:" + senderNumber); System.out.println("当前主余额:" + mainBalance + " CUC"); } else { // 容错处理:如果短信格式不符合预期,提示或记录日志 System.out.println("短信格式不匹配,无法提取数据"); }
小提示
如果后续短信格式有细微变化(比如多了空格、标点调整),可以给正则加一些弹性规则:比如用\\s*匹配任意数量的空格,用\\.?匹配可选的小数点,提升正则的鲁棒性。
内容的提问来源于stack exchange,提问作者Erich García
相关产品推荐
相关产品推荐

