0
点赞
收藏
分享

微信扫一扫

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运行效率则要快了很多的呢:

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



举报

相关推荐

String 类原生的字符串处理方法

0 条评论