最近有个业务,识别跑步类软件的图片上的文字,如下图:
调用百度高精度OCR接口,识别出来的字符是这样的:
中国移动令 VOLTE
09:48
<
10.04公
※04月29日05:46
慢0619
0513快
054300:57:28638.1
11187
194
89
(步)
(步分钟)
(厘米
此时就需要使用正则表达式进行字符的筛选,只找到需要的耗时,完成时间,里程数。
使用Java正则表达式的代如下:
List<String> ocrList=new ArrayList<>();
ocrList.add("1212:00:0012312");
ocrList.add("12.0");
ocrList.add("122.02");
ocrList.add("122.02.2323");
ocrList.add("12月03日12:00");
ocrList.add("****12月03日12:00");
ocrList.add("****12月03日12:008823");
//选择完成时间
String score=ocrList.parallelStream().map(s->{
Pattern pattern = Pattern.compile("\\d{1,2}:\\d{1,2}:\\d{1,2}");
Matcher matcher = pattern.matcher(s);
if(matcher.find())
return matcher.group(0);
return "";
}).filter(s2->s2.matches("\\d{1,2}:\\d{1,2}:\\d{1,2}")).findFirst().orElse("");
log.info(score);
//过滤第一个出现的里程,如:10.65
String miles=ocrList.parallelStream().map(s1->{
Pattern pattern = Pattern.compile("\\d{1,2}\\.\\d{1,2}");
Matcher matcher = pattern.matcher(s1);
if(matcher.find())
return matcher.group(0);
return "";
}).filter(s2->s2.matches("\\d{1,2}\\.\\d{1,2}")).findFirst().orElse("");
//过滤打卡日期
String completionTimeStr=ocrList.parallelStream().map(s->{
Pattern pattern = Pattern.compile("\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}");
Matcher matcher = pattern.matcher(s.replace("月","-").replace("日"," "));
if(matcher.find())
return matcher.group(0);
return "";
}).filter(s2->s2.matches("\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}")).findFirst().orElse("");
log.info(score+"====="+miles+"===="+completionTimeStr);