【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 = ""; ...
随机推荐
- Java io流完成复制粘贴功能
JAVA 中io字节输入输出流 完成复制粘贴功能: public static void main(String[] args) throws Exception{ // 创建输入流要读 ...
- 【文文殿下】对后缀自动机(SAM)的理解
后缀自动机,是一种数据结构,是由状态和转移关系构成的.它虽然叫做后缀自动机,可是他却与后缀并没有什么太大的联系. 后缀自动机的每一种状态都是原串的一些子串的集合,每个子串只唯一存在于某个状态中,对每一 ...
- PHP中关于foreach的笔试题
1,php与C++的不同之处是PHP中变量没有局部作用域,只有函数作用域和全局作用域.如下函数,在php中,$name的作用域是函数test():在C++中$name的作用域是for循环体,for循环 ...
- PHP消息队列实现
一个经典的消息队列就是这样的,主要是入队出队操作. shell脚本日志输出 学习地址:http://www.imooc.com/article/19111
- php性能优化三(PHP语言本身)
0.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册 ...
- 「雅礼集训 2017 Day2」水箱
题目链接 题意分析 我们用\(f[i][j]\)表示当前到达第\(i\)个位置水位高度为\(j\)的答案 如果那么\(h[i]\)为\(i\)和\(i+1\)之间的支柱高度 那么如果\(j≤h[i]\ ...
- Nodejs统计每秒记录日志数
问题:线上的写日志操作非常频繁,想统计每秒写了多少行数据?假如没法送一个消息写一个日志,问题也就变成了,每秒发送多少消息了. 日志采用log4js书写,格式如下: [-- ::33.548] [INF ...
- Learn to See in the Dark(论文阅读笔记)
最近做项目看了一篇论文<Learn to See in the Dark>下面是一些论文笔记 概括: 这篇论文主要介绍的是在低光照的环境下用两个标准的FCN网络,通过控制变量法来对比不同的 ...
- noip rp++
from JOKER-Y
- mysq5.7
1.mv mysql-5.7.22-linux-glibc2.12-x86_64 mysql 2. chown -R work:work /home/work/mysql 3.su - work 4. ...