【Java】短信信息提取设计
问题产生:当有要求做信息有效性校验的时候,如何提取短信中有用的信息?
举个例子:有这样一条短信消息:
【XXXXXX提醒】尊敬的客户,截止03月21日15:29,您本月套餐中包含手机上网国内流量累计1024.00M(含上月结转1.95M),还剩0.00M;超出套餐后的国内流量按0.03元/MB收费。推荐您回复KTBY10订购10元500M国内流量包,订购后立即生效,按月收取费用,次月自动续订,当月可重复订购,当月剩余流量可结转至次月使用。更多流量包……
平台:java + springboot
这个问题解决的思路就是:类似联想这种信息产生的源头。是怎么生成的?
我的解决方案:
step1:标注有效(可变)信息,我这边采用的是{};
【XXXXXX提醒】尊敬的客户,截止{03}月{21}日{15:29},您本月套餐中包含手机上网国内流量累计{1024.00}M(含上月结转{1.95}M),还剩{0.00}M;超出套餐后的国内流量按0.03元/MB收费。推荐您回复KTBY10订购10元500M国内流量包,订购后立即生效,按月收取费用,次月自动续订,当月可重复订购,当月剩余流量可结转至次月使用。更多流量包……
step2: 提取出模板占位的文字,就是花括号以外的,固定文字;
step3: 用上一步提炼的文字,对接下来需要处理的类似信息做信息提取。
Code:
public class TestRegex {
public static void main(String[] args) {
//配置的信息模板
String modelString = "【提醒】尊敬的客户,截止{03}月{21}日 {15:29},您本月套餐中包含手机上网国内流量累计{1024.00M}(含上月结转{1.95M}),还剩{0.00}M;超出套餐后的国内流量按{0.03}元/MB收费。" +
"推荐您回复KTBY10订购10元500M国内流量包,订购后立即生效,按月收取费用,次月自动续订,当月可重复订购,当月剩余流量可结转至次月使用。" +
"更多流量包介绍";
//用来检测的
String targetString = "【提醒】尊敬的客户,截止05月28日 15:44,您本月套餐中包含手机上网国内流量累计1024.00M(含上月结转1.95M),还剩0.00M;超出套餐后的国内流量按0.03元/MB收费。" +
"推荐您回复KTBY10订购10元500M国内流量包,订购后立即生效,按月收取费用,次月自动续订,当月可重复订购,当月剩余流量可结转至次月使用。" +
"更多流量包介绍";
//必要的删除特殊字符
modelString = modelString.replaceAll("[\\(,\\),(,),]","");
LinkedList<String> keyWordList = new LinkedList<>();
String[] abc = modelString.split("\\{");
for (String s : abc) {
String[] c = s.split("\\}");
if (c.length>=2){
keyWordList.add(c[1]);
}
}
ArrayList<String> values = new ArrayList<>();
languageParse(targetString, keyWordList,values);
System.out.println(values);
}
private static void languageParse(String sentence, LinkedList<String> keyWordList, ArrayList<String> values){
//做数字的提取
String regEx = "[^0-9,.,:]";
Pattern p = Pattern.compile(regEx);
if(sentence.length()>0 && keyWordList.size()>0){
if (sentence.contains(keyWordList.get(0))){
String value = sentence.split(keyWordList.get(0),2)[0];
Matcher m = p.matcher(value);
values.add(m.replaceAll("").trim());
sentence = sentence.split(keyWordList.get(0),2)[1];
keyWordList.poll();
languageParse(sentence, keyWordList, values);
}else{
//剔除
System.out.println("发现不存在的关键字:"+ keyWordList.poll());
languageParse(sentence, keyWordList, values);
}
}
}
}
提取结果:
[05, 28, 15:44, 1024.00, 1.95, 0.00]
一些补充:
1、为什么需要有一个model?
利用springboot的配置yml文件,配置我们需要处理文字信息模板,这样能够更加灵活。
2、这个问题解决的出发点是从信息生成的源头考虑的:“原先的信息是如何装配的?”从这里做的切入,才有了这个思路。
3、如果有更好的思路,可以给我评论鸭!
【Java】短信信息提取设计的更多相关文章
- java短信接口调用
java短信接口调用 之前一直在一个传统的单位上班好多听容易的技术都没接触过,即使有时候想搞一搞类似于支付宝支付,短信接口调用,微信公众号,小程序之类等功能,一直有心无力终于跳槽了,估计是氛围的原因吧 ...
- java短信接口
一.背景 从是Java一直想做一个跟生活联系特别紧密的东西,比如短信.邮箱.电话什么的一直是我感兴趣的,可是楞是当初没有头绪弄,恰巧今天公司在做一个 webrtc的视频会议的软件,刚好有短信这个需求, ...
- java 短信猫发送短信的方法
用java实现短信收发的功能,目前一般项目中短信群发功能的实现方法大致有下面三种: · 1. 向运行商申请短信网关,不需要额外的设备,利用运行商提供的API调用程序发送 ...
- java短信验证和注册
最近公司需要用到短信验证注册,所以申请了阿里云的短信服务.我的项目是分布式的spring boot 原理: 利用第三方发送短信 获取回执消息,然后存入缓存里面 将用户填写的验证码与缓存里面的验证码对比 ...
- JAVA短信验证码 工具类
MsgCodeUtil.java package com.hg.util; import com.soyea.enums.ResultEnum; import com.soyea.exception. ...
- php 对接java短信接口带有英文逗号就无法通过
在对接短息接口时,对方是java接口,要求content两次编码 短信内容(Content)发起请求前必须进行URL转码.例如对于短信内容为“中文短信abc”,转码过程如下(java语言): Stri ...
- 使用java短信验证
package cn.geekss.util; import java.io.BufferedReader;import java.io.InputStreamReader;import java.i ...
- java短信接入
1,注册一个中间公司的短信平台(比如网建) 2,找到密匙 3,找到链接案例 4,复制代码 下载jar包 import java.io.UnsupportedEncodingException;imp ...
- java 短信验证码===随机数
生成验证码,验证码生成 String mobile = phone;// 手机号码,多个号码使用","分割 // 生成随机6位码 String s = ""; ...
随机推荐
- mxonline实战6 , 忘记用户密码时进行重置
对应github地址:密码重置 原理: 1. 一个需要输入用户邮箱和注册码的密码忘记页面 2. 点击提交后,用户邮箱收到一个邮件,包含重置密码的链接 3. 点击链接进入密码重置页面 ...
- iOS学习笔记(4)——显示单组件选取器
1. 创建工程 创建新工程,create a new Xcode project 创建single view application 创建名为PickerViewTest的工程 2. 创建xib文件 ...
- saltstack 动态pillar实现
简介 pillar支持的数据存储方式有很多,mysql, mogo,json等.本篇介绍关于http存储方式. 首先简要说明整个流程:salt-master会去一个指定http发送get请求获取一个j ...
- Vue-cli 2.9 多页配置及多页面之间的跳转问题
vue开发,现在大部分做的都是(SPA)应用,但是,由于,需求不同,我们针对的用户需求变更较为,频繁,如果每次都全量打包更新,给开发的自测,及测试妹子的任务就会多,每次都要重新验证一下才放心.所以,想 ...
- springmvc 运行原理 Spring ioc的实现原理 Mybatis工作流程 spring AOP实现原理
SpringMVC的工作原理图: SpringMVC流程 . 用户发送请求至前端控制器DispatcherServlet. . DispatcherServlet收到请求调用HandlerMappin ...
- windows下vim中文乱码处理
现象:gvim安装后,打开中文utf-8编码的文件中文显示乱码 处理:1.启动gvim8.0,菜单 ”编辑“->"启动设定"在文件最开始处添加如下两行set fileenco ...
- js字符串去重
js字符串去重: 1. 去掉字符串前后所有空格: function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } ...
- P1525 关押罪犯 题解
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; //带边权 ...
- django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes')
环境介绍 Django (2.1) Python 3.5.5 mysqlclient (1.4.2.post1) Mysql 5.6.28 RHEL 7.3 在migrate时候报错 model代码 ...
- Cinderella
Chapter 1 Ella, Ella, CinderellaThere is a beauiful girl. Her name is Ella.She lives with a wicked s ...