工作中经常会用到在文本中每行检索某种pattern,刚才测试了三种方式,发现实际性能和预想的有区别

方式1:

直接字符串的matches方法,【string.matches("\\d+")】

方式2:

先构建一个单行匹配的pattern,然后用这个pattern去match

Pattern p1=Pattern.compile("\\d+");

Matcher m=p1.matcher(sar[i]);

方式3:

构建一个可以匹配换行符DOTALL模式的pattern,然后在整个文本中find

Pattern p2=Pattern.compile("\\d+",Pattern.DOTALL );

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class TestRe { /**
* @param args
*/
public static void main(String[] args) {
String s1="abc";
String s2="123";
//构建一个多行的字符串
StringBuilder stb=new StringBuilder();
for(int i=0;i<10000;i++){
int k=new Random().nextInt()%2;
if(k==0){
stb.append(s1+"\n");
}
else{
stb.append(s2+"\n");
}
} Pattern p2=Pattern.compile("\\d+",Pattern.DOTALL );
Pattern p1=Pattern.compile("\\d+");
String ts=stb.toString();
String[] sar=ts.split("\n");
test1(sar);
test2(ts,p2);
test3(sar,p1); } public static void test1(String[] sar){
long st=System.nanoTime();
List<String> l=new ArrayList<String>();
for(int i=0;i<sar.length;i++){
if(sar[i].matches("\\d+")){
l.add(sar[i]);
}
}
System.out.println("1Size"+l.size());
long et=System.nanoTime();
System.out.println("test1:"+(et-st)+"纳秒");
} public static void test3(String[] sar,Pattern p1){
long st=System.nanoTime();
List<String> l=new ArrayList<String>();
for(int i=0;i<sar.length;i++){
Matcher m=p1.matcher(sar[i]);
if(m.matches()){
l.add(sar[i]);
}
}
System.out.println("3Size"+l.size());
long et=System.nanoTime();
System.out.println("test3:"+(et-st)+"纳秒");
} public static void test2(String s,Pattern p){
long st=System.nanoTime();
List<String> l=new ArrayList<String>();
Matcher m=p.matcher(s);
while(m.find()){
l.add(m.group());
}
System.out.println("2Size"+l.size());
long et=System.nanoTime();
System.out.println("test2:"+(et-st)+"纳秒");
} }

下

面是运行结果,方法一竟然性能最低,在很简单的正则表达式或者不需要替换,不需要找出子匹配时,这个方法是我用的最多的,想不到性能最差。

测试一:

1Size4999
test1:53153038纳秒
2Size4999
test2:13393716纳秒
3Size4999
test3:4527045纳秒

测试二:

1Size4941
test1:38807545纳秒
2Size4941
test2:6826025纳秒
3Size4941
test3:3127127纳秒

看起来好像是方法三优于方法二,实则不然,如果把调用次序换下,方法二有会快于方法三,我的猜想是底层调用可能有单例对象什么的。先调用的pattern可能被复用。没做调查

调换后的结果:

测试一:

2Size5093
test2:12792156纳秒
3Size5093
test3:13665544纳秒
1Size5093
test1:56139648纳秒

测试二:

2Size4952
test2:12030397纳秒
3Size4952
test3:20046193纳秒
1Size4952
test1:40124475纳秒

Java中正则匹配性能测试的更多相关文章

  1. JS中正则匹配的三个方法match exec test的用法

    javascript中正则匹配有3个方法,match,exec,test: match是字符串的一个方法,接收一个RegExp对象做为参数: match() 方法可在字符串内检索指定的值,或找到一个或 ...

  2. 关于php中正则匹配包括换行符在内的任意字符的问题总结

    要使用正则匹配任意字符的话,通常有以下几种方法,这里我分别对每一种方法在使用的过程中做一个总结: 第一种方式:[.\n]*? 示例 ? PHP preg_match_all('/<div cla ...

  3. Python中正则匹配使用findall时的注意事项

    在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串  "123@qq.comaaa@163.combbb@126.comasdf111@a ...

  4. Python中正则匹配使用findall,捕获分组(xxx)和非捕获分组(?:xxx)的差异

    转自:https://blog.csdn.net/qq_42739440/article/details/81117919 下面是我在用findall匹配字符串时遇到的一个坑,分享出来供大家跳坑. 例 ...

  5. html中正则匹配img

    1.正则匹配html中的img标签,取出img的url并进行图片文件下载: /// <summary> /// 将image标签的src属性的url替换为base64 /// </s ...

  6. python中正则匹配之re模块

    Python中正则表达式 re:re是提供正则表达式匹配操作的模块 一.什么是正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某个模式匹配,Python 自1.5版本起 ...

  7. java 中 正则 正则表达式 匹配 url

    不多说 [http|https]+[://]+[0-9A-Za-z:/[-]_#[?][=][.][&]]* 这个就是匹配 网络上的网址 又称 url . 最起码 绝大部分的taobao ur ...

  8. JavaScript 中正则匹配时结果不一致的问题

    创建示例项目 考察如下场景,我们有个输入框组件,输入时同时进行校验. interface IInputProps { label: string; } function Input({ label } ...

  9. Java中正则Matcher类的matches()、lookAt()和find()的区别

    在Matcher类中有matches.lookingAt和find都是匹配目标的方法,但容易混淆,整理它们的区别如下: matches:整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回 ...

随机推荐

  1. Django框架(一)-Django初识

    Django初识 一.Web框架本质—自己实现Web框架 1.所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端 import socket sk = sock ...

  2. bzoj4399 魔法少女LJJ 线段树合并

    只看题面绝对做不出系列.... 注意到\(c \leqslant 7\),因此不会有删边操作(那样例删边干嘛) 注意到\(2, 5\)操作十分的有趣,启示我们拿线段树合并来做 操作\(7\)很好处理 ...

  3. [Luogu5161]WD与数列(后缀数组/后缀自动机+线段树合并)

    https://blog.csdn.net/WAautomaton/article/details/85057257 解法一:后缀数组 显然将原数组差分后答案就是所有不相交不相邻重复子串个数+n*(n ...

  4. 问题记录:未设置为接受端口“文件和打印机共享(SMB)”上的连接

    解决办法: 网络(右击)——属性——本地连接(右击)——属性——此连接使用下列选项——Microsoft网络的文和打印共享(打上勾)

  5. Windows Phone background Audio 后台音频

    Windows Phone 后台音频的确不是什么新鲜的话题了,但发现目前在WP平台的音频播放应用多多少少会有一些瑕疵,所以在此给大家在此介绍下这个功能给有需要的朋友们. 首先介绍下我们的应用在后台播放 ...

  6. Shell 学习笔记之条件语句

    条件语句 if # if if condition then command fi # if else if condition then command else command fi # if e ...

  7. linux下TP5安装好Workerman 报错:Class 'think\worker\Server' not found

    今天把功能放到服务器,本地测试正常,上传到服务器上报错Class 'think\worker\Server' not found 首先想到的是Windows和Linux下大小写的问题,查看了代码,并没 ...

  8. 如何在ubuntu安装phpstorm

    第一步:使用组合键ctrl+alt+t 打开Terminal,cd /home/xxx(当前登录用户名)/downloads(下载目录) 第二步:下载 phpstorm 附截止发文最新版本链接:htt ...

  9. .net 基于Jenkins的自动构建系统开发

    先让我给描述一下怎么叫一个自动构建或者说是持续集成 : 就拿一个B/S系统的合作开发来说,在用SVN版本控制的情况下,每个人完成自己代码的编写,阶段性提交代码,然后测试-修改,最后到所有代码完工,进行 ...

  10. CentOS 5.8 上安装 systemtap-2.6 转

    http://segmentfault.com/a/1190000002541077#articleHeader1