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

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

【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. 洛谷P2179 [NOI2012]骑行川藏(拉格朗日乘数法)

    题面 传送门 题解 看\(mashirosky\)大佬的题解吧--这里 //minamoto #include<bits/stdc++.h> #define R register #def ...

  2. 九,php中上传文件

    1,php网页上传文件大小有限制的,默认最大2M.可以修改php.ini调节大小,upload_max_filesize = 2M.网页上传使用http协议,上传大文件性能不好:有些公司做一个客户端软 ...

  3. [Flex] 组件Tree系列 —— 运用variableRowHeight和wordWrap设置可变行高

    mxml: <?xml version="1.0" encoding="utf-8"?> <!--功能描述:运用variableRowHeig ...

  4. 设置跨交换机VLAN

    4台计算机,pc1 pc2 连接到交换机1的f1/1和f1/2.Pc3 pc4 连接到交换机2的f1/1和f1/2.pc1设置ip地址192.168.1.10,pc2 pc3 pc4设置ip地址192 ...

  5. [科普] 借助 everything 扩展教你屏蔽网址或转发网址

    教你屏蔽网址或转发网址 万恶之源 为什么写这篇文章,俺觉得大家应该是有这个需(bai)求(du)的.只是不知道如何操作... 一.屏蔽网址 1.借助系统自带防火墙 (不推荐) Linux 下有 ipt ...

  6. 在linux云服务器上运行Jar文件

    在linux服务器上运行Jar文件时通常的方法是: $ java -jar test.jar 这种方式特点是ssh窗口关闭时,程序中止运行.或者是运行时没法切出去执行其他任务,有没有办法让Jar在后台 ...

  7. 【转载】Java 9 新特性——模块化

    来自 <http://www.jianshu.com/p/053a5ca89bbb#> 前言 年,我们将迎来 Java 语言的 22 岁生日,22岁,对于一个人而言,正是开始大展鸿图的年纪 ...

  8. Python【每日一问】16

    问: [基础题]TCP/UDP/HTTP协议区别 [提高题]在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...

  9. 语音转文字小工具开发Python

    # -*- coding: utf- -*- import requests import re import os import time from aip import AipSpeech fro ...

  10. SBC应用

    在VoIP呼叫中主要使用会话发起协议(SIP),H.323和MGCP呼叫信令协议,Sbc 在主叫和被叫的信令/媒体路径之间引入. 通常,SBC隐藏网络拓扑,接管呼入并生成到新的请求分支到被叫.技术上叫 ...