工作中经常会用到在文本中每行检索某种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. 深入理解Python生成器(Generator)

    我们可以通过列表生成式简单直接地创建一个列表,但是受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,而且如果我们仅仅需要访问前面几个元素,那后面绝大多 ...

  2. get与post区别大揭秘

    以往的标准答案: GET在浏览器回退时是无害的,而POST会再次提交请求. GET请求会被浏览器主动cache,而POST不会,除非手动设置. GET请求只能进行url编码,而POST支持多种编码方式 ...

  3. hdu 2197 推公式

    题意:由0和1组成的串中,不能表示为由几个相同的较小的串连接成的串,称为本原串,有多少个长为n(n<=100000000)的本原串?答案mod2008.例如,100100不是本原串,因为他是由两 ...

  4. 2016 UESTC Training for Data Structures 题解

    题解在下已经写过一次了,所以就不再写了,下面只有代码 题解下载(1):http://pan.baidu.com/s/1hsAUjMs 题解下载(2):http://pan.baidu.com/s/1m ...

  5. Codeforces Round #293 (Div. 2) B. Tanya and Postcard 水题

    B. Tanya and Postcard time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  6. HDU 4716 A Computer Graphics Problem (水题)

    A Computer Graphics Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  7. oracle存储过程获取异常信息码和异常信息

    oracle存储过程,可以通过sqlcode 获取异常编码.通过sqlerrm获取异常信息. 例子: create or replace procedure write2blob(p_id in nu ...

  8. Maven系列--setting.xml 配置详解

    文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...

  9. oracle 存储过程循环体中的return和exit区别:

    oracle 存储过程循环体中的return和exit区别:   (1) return 跳出整个循环,终止该循环, 后面的不再执行.     相当于 Java 中的break;   (2)  exit ...

  10. LeetCode152:Maximum Product Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...