【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、如果有更好的思路,可以给我评论鸭!

 

posted on 2019-04-04 11:00  Never_Await_Victory  阅读(930)  评论(0编辑  收藏  举报

导航