java正则匹配特别慢怎么优化,正则的替换方案,比正则更好用的方法java处理方案

目录

1、场景描述:

2、后台刷出来的日志如下:

3、说完前面的耗时超长的情况,怎么样优化呢?

完整的解决方案

 

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);

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦思冥想行则将至

穷,有钱的大爷上个两分钱吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值