目录
1、场景描述:
正则匹配的代码如下,效率极其低下,居然能够耗时3分钟。500汉字的文本的正则匹配耗时实在是太慢了!
Instant startTimeMark = Instant.now();
if (title.contains("申请医疗器械注册获受理") || title.contains("申报医疗器械注册获受理") || title.contains("申报医疗器械注册证变更获受理") ||
content.contains("申请医疗器械注册获受理") || content.contains("申报医疗器械注册获受理") || content.contains("申报医疗器械注册证变更获受理") ||
HtmlFilterTagUtils.isPattern(content, ".*申请.*专利.*") ||
HtmlFilterTagUtils.isPattern(content, ".*申请.*证书.*") ||
HtmlFilterTagUtils.isPattern(content, ".*申请.*牌照.*") ||
HtmlFilterTagUtils.isPattern(content, ".*申请.*资格.*") ||
HtmlFilterTagUtils.isPattern(content, ".*申请.*资质.*") ||
HtmlFilterTagUtils.isPattern(content, ".*一致性评价获受理.*") ||
HtmlFilterTagUtils.isPattern(content, ".*一致性评价获申请.*") ||
HtmlFilterTagUtils.isPattern(title, ".*申请.*专利.*") ||
HtmlFilterTagUtils.isPattern(title, ".*申请.*证书.*") ||
HtmlFilterTagUtils.isPattern(title, ".*申请.*牌照.*") ||
HtmlFilterTagUtils.isPattern(title, ".*申请.*资格.*") ||
HtmlFilterTagUtils.isPattern(title, ".*申请.*资质.*") ||
HtmlFilterTagUtils.isPattern(title, ".*一致性评价获受理.*") ||
HtmlFilterTagUtils.isPattern(title, ".*一致性评价获申请.*")) {
//。。。。。。其他逻辑省略不写
}
Instant endTimeMark = Instant.now();
Long period = Duration.between(startTimeMark, endTimeMark).toMillis();
log.info("正则表达式耗时监控,资讯id :【{}】,耗时{} 毫秒", eventCheckVo.getNewsId(), period);
2、后台刷出来的日志如下:
2020-12-14 20:26:09.145| :当前资讯id=1181781879432,本地校验服务耗时178792毫秒!
总共耗时大约3分钟,这样的正则真的好慢呀,特别是正文文字过多的时候会出现这个情况!!
3、说完前面的耗时超长的情况,怎么样优化呢?
这里提供一个常用的替代方案比较超级高效的有用的替换正则的方案:
public static void main(String[] args) {
String content="本次发行的保荐机构为东莞证券,这是东莞证券今年保荐成功的第5单IPO项目。此前,7月16日,东莞证券保荐的司过会;7月17日";
System.out.println("content.indexOf(\"吗\")="+content.indexOf("吗"));
System.out.println("content.indexOf(\"ma\")="+content.indexOf("ma"));
if(content.indexOf("吗")>content.indexOf("wangb")){
System.out.println(".* 不存在的数据模拟测试不成功");
}
System.out.println("content.indexOf(\"证券\")="+content.indexOf("证券"));
System.out.println("content.indexOf(\"机构\")="+content.indexOf("机构"));
if(content.indexOf("证券")>content.indexOf("机构")){
System.out.println(".*机构.*证券.* 模拟成功");
}
}
优化后的耗时监控日志:
2020-12-14 21:47:39.061| :正则表达式替代方案耗时监控,资讯id :【1181781879432】,耗时0 毫秒
2020-12-14 21:48:02.564| :正则表达式耗时监控,资讯id :【1181781879432】,耗时23505 毫秒
完整的解决方案
Instant startTimeMark = Instant.now();
if (title.contains("申请医疗器械注册获受理") || title.contains("申报医疗器械注册获受理") || title.contains("申报医疗器械注册证变更获受理") ||
content.contains("申请医疗器械注册获受理") || content.contains("申报医疗器械注册获受理") || content.contains("申报医疗器械注册证变更获受理") ||
content.contains("一致性评价获受理") ||
content.contains("一致性评价获申请") ||
title.contains("一致性评价获申请")
|| title.contains("一致性评价获受理")) {
//其他逻辑
}
}
if (eventThirdLevelList.contains("重大突破") || eventThirdLevelList.contains("授予资质")) {
int indexContent = content.indexOf("申请");
if (indexContent > 0) {
if (content.indexOf("专利") > indexContent ||
content.indexOf("证书") > indexContent ||
content.indexOf("牌照") > indexContent ||
content.indexOf("资格") > indexContent ||
content.indexOf("资质") > indexContent) {
raiseInfo.add("检查【重大突破】或【授予资质】,确定继续公开吗?");
}
}
int indexTitle = title.indexOf("申请");
if (indexContent > 0) {
if (title.indexOf("专利") > indexTitle ||
title.indexOf("证书") > indexTitle ||
title.indexOf("牌照") > indexTitle ||
title.indexOf("资格") > indexTitle ||
title.indexOf("资质") > indexTitle) {
//其他逻辑。。。。
}
}
}
Instant endTimeMark = Instant.now();
Long period = Duration.between(startTimeMark, endTimeMark).toMillis();
log.error("正则表达式替代方案耗时监控,资讯id :【{}】,耗时{} 毫秒", eventCheckVo.getNewsId(), period);