问题产生:当有要求做信息有效性校验的时候,如何提取短信中有用的信息?

举个例子:有这样一条短信消息:

【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】短信信息提取设计的更多相关文章

  1. java短信接口调用

    java短信接口调用 之前一直在一个传统的单位上班好多听容易的技术都没接触过,即使有时候想搞一搞类似于支付宝支付,短信接口调用,微信公众号,小程序之类等功能,一直有心无力终于跳槽了,估计是氛围的原因吧 ...

  2. java短信接口

    一.背景 从是Java一直想做一个跟生活联系特别紧密的东西,比如短信.邮箱.电话什么的一直是我感兴趣的,可是楞是当初没有头绪弄,恰巧今天公司在做一个 webrtc的视频会议的软件,刚好有短信这个需求, ...

  3. java 短信猫发送短信的方法

    用java实现短信收发的功能,目前一般项目中短信群发功能的实现方法大致有下面三种: ·                 1. 向运行商申请短信网关,不需要额外的设备,利用运行商提供的API调用程序发送 ...

  4. java短信验证和注册

    最近公司需要用到短信验证注册,所以申请了阿里云的短信服务.我的项目是分布式的spring boot 原理: 利用第三方发送短信 获取回执消息,然后存入缓存里面 将用户填写的验证码与缓存里面的验证码对比 ...

  5. JAVA短信验证码 工具类

    MsgCodeUtil.java package com.hg.util; import com.soyea.enums.ResultEnum; import com.soyea.exception. ...

  6. php 对接java短信接口带有英文逗号就无法通过

    在对接短息接口时,对方是java接口,要求content两次编码 短信内容(Content)发起请求前必须进行URL转码.例如对于短信内容为“中文短信abc”,转码过程如下(java语言): Stri ...

  7. 使用java短信验证

    package cn.geekss.util; import java.io.BufferedReader;import java.io.InputStreamReader;import java.i ...

  8. java短信接入

    1,注册一个中间公司的短信平台(比如网建) 2,找到密匙  3,找到链接案例 4,复制代码 下载jar包 import java.io.UnsupportedEncodingException;imp ...

  9. java 短信验证码===随机数

    生成验证码,验证码生成 String mobile = phone;// 手机号码,多个号码使用","分割 // 生成随机6位码 String s = ""; ...

随机推荐

  1. 打开SQL Server2000企业管理器时候提示“MMC 无法创建管理单元 ”

    今天上午在打开SQL Server 2000 企业管理器时候提示“MMC 无法创建管理单元”错误.

  2. verify验证插件的详解

    使用此验证插件,我们只需要新建一个实例对象,同时传入一个json对象就行了,这里我们只传入了两个属性:checkItem和callback.下面的代码解析,我们就按照这个例子来. var verify ...

  3. @ModelAttribute注解和POJO传参过程

    1.@ModelAttribute注解 @ModelAttribute主要有三个用途,对方法进行注解,对参数进行注解,还有@ModelAttribute和@RequestMapping一起对方法进行注 ...

  4. 网络基础 09_STP生成树协议

    1 STP概念 冗余拓扑结构 冗余拓扑结构能解决单点故障的问题 冗余拓扑结构会引起广播风暴,多帧COPY,MAC地址表错误的问题 广播风暴 当主机X发送一个广播包后 交换机继续没完没了的更新广播流量 ...

  5. P1525 关押罪犯 题解

    #include<iostream> #include<cstdio> #include<algorithm> using namespace std; //带边权 ...

  6. tp5.0 根据经纬度 获取附近信息

    自己备注一下 /* *参数说明: *$lng 经度 *$lat 纬度 *$distance 周边半径 默认是500米(0.5Km) */ public function returnSquarePoi ...

  7. Mac下常用快捷键(转)

    前提,先熟读键盘快捷键符号:http://www.cnblogs.com/EasonJim/p/6350075.html 基本操作: Command-Z 撤销 Command-X 剪切 Command ...

  8. 关于微信企业号操作api的sdk封装 (.net)

    做微信的第三方开发业半年多了 现在献上微信企业号的操作sdk(包括源码) 本人水平有限 望大家多提意见 下载地址献上:下载

  9. C# 文件操作系列一

    在.Net环境中,所有关于文件操作的类都在System.IO命名空间下,注:在修改文件时,安全性显得格外重要,但是本随笔不过多讲述安全性,这里假设我们有足够的权限. 1.管理文件系统 先通过一幅图来了 ...

  10. ubuntu 添加多个IP

    上次这个问题 :  UBUNTU 无法解析域名 解决方法 解决后,每次重启电脑都需要重新配置 /etc/resolv.conf. 这次添加IP的时候留心发现,在/etc/network/interfa ...