天天看点

Java中正则匹配文本的效率不及String的自带方法String.indexOf(““) > 0效率高,解决怎么样匹配文字字符串的判断方法

业务办理的时候发现正则的匹配效率极其低下,耗时居然要1分钟,而jdk的String的index这个类居然耗时只有100分之一,至于具体的区别如下

具体的代码逻辑如下:

1、正则匹配耗时监控

//10、资讯主表、快讯表当【新闻来源】和【媒体出处】不等于 新华网/新华社/新华每日电讯/中国金融信息网/中国金融信息网(微博)/国家财经周刊/新华视点 时,
        // 内容里包含新华网/新华社/新华每日电讯/中国金融信息网/中国金融信息网(微博)/国家财经周刊/新华视点 时,
        // 做校验提示,提示语: 内容可能涉及被限制的新华社版权媒体相关,确认要公开吗?
        if (!HtmlFilterTagUtils.isPattern(dsSourceName, ".*(新华网|新华社|新华每日电讯|中国金融信息网|中国金融信息网\\(微博\\)|国家财经周刊|新华视点).*")) {
            if (!HtmlFilterTagUtils.isPattern(mediaSource, ".*(新华网|新华社|新华每日电讯|中国金融信息网|中国金融信息网\\(微博\\)|国家财经周刊|新华视点).*")) {
              if (HtmlFilterTagUtils.isPattern(content, ".*(新华网|新华社|新华每日电讯|中国金融信息网|中国金融信息网\\(微博\\)|国家财经周刊|新华视点).*")) {
                   raiseInfo.add("内容可能涉及被限制的新华社版权媒体相关,确认要公开吗?");
              }
               

            }
        }
        Instant endTimeMark4 = Instant.now();
        Long period4 = Duration.between(endTimeMark3, endTimeMark4).toMillis();
        log.error("getFirstVersionCheck--->HtmlFilterTagUtils.isPattern 耗时{} 毫秒", operateVo.getNewsId(), period4);      

2、正则匹配耗时监控结果:

2020-12-04 10:19:43.620| :checkPublish--->context.executeStrategy资讯id :【1181785279403】context.executeStrategy走完,耗时26165 毫秒

3.使用JDK里面的String类里面的.indexOf("新华网") > 0来替代正则匹配方式

//10、资讯主表、快讯表当【新闻来源】和【媒体出处】不等于 新华网/新华社/新华每日电讯/中国金融信息网/中国金融信息网(微博)/国家财经周刊/新华视点 时,
        // 内容里包含新华网/新华社/新华每日电讯/中国金融信息网/中国金融信息网(微博)/国家财经周刊/新华视点 时,
        // 做校验提示,提示语: 内容可能涉及被限制的新华社版权媒体相关,确认要公开吗?
        if (!HtmlFilterTagUtils.isPattern(dsSourceName, ".*(新华网|新华社|新华每日电讯|中国金融信息网|中国金融信息网\\(微博\\)|国家财经周刊|新华视点).*")) {
            if (!HtmlFilterTagUtils.isPattern(mediaSource, ".*(新华网|新华社|新华每日电讯|中国金融信息网|中国金融信息网\\(微博\\)|国家财经周刊|新华视点).*")) {
                if (content.indexOf("新华网") > 0 || content.indexOf("新华社") > 0 || content.indexOf("新华每日电讯") > 0
                        || content.indexOf("中国金融信息网") > 0 || content.indexOf("中国金融信息网(微博)") > 0 || content.indexOf("国家财经周刊") > 0
                        || content.indexOf("新华视点") > 0) {
                    raiseInfo.add("内容可能涉及被限制的新华社版权媒体相关,确认要公开吗?");
                }

            }
        }
        Instant endTimeMark4 = Instant.now();
        Long period4 = Duration.between(endTimeMark3, endTimeMark4).toMillis();
        log.error("getFirstVersionCheck--->HtmlFilterTagUtils.isPattern 耗时{} 毫秒", operateVo.getNewsId(), period4);      

3、第二种耗时统计,大文本的情况下替代掉正则匹配,使用String自有类方法判断,结果如下

2020-12-04 10:19:00.355| :checkPublish--->context.executeStrategy资讯id :【1181785279403】context.executeStrategy走完,耗时6 毫秒

通过以上俩者对比

很明显的结论:

大文本的字符串匹配判断方法,正则不及String的indexof的方法的效率,主要是正则是一个字符串的匹配,而index的是一个汉字来匹配的

下面这个正则表达式作为判断是否匹配,这个正则表达式来判断是否匹配的效率真的很低,发现一片1000汉字的文章,匹配运行居然要1分钟

public static Boolean isPattern(String content, String regex) {
        if (StringUtils.isBlank(content)) {
            return false;
        }
        Pattern pa = Pattern.compile(regex, Pattern.DOTALL);
        Matcher ma = pa.matcher(content);
        if (ma.find()) {
            return true;
        }
        return false;
    }      

正则匹配HtmlFilterTagUtils.isPattern判断效率如下:

Java中正则匹配文本的效率不及String的自带方法String.indexOf(““) > 0效率高,解决怎么样匹配文字字符串的判断方法

而jdk的content.indexOf("新华网") > 0运行效率则要快了很多的呢: