正则表达式与字符操作的效率比较

  一起一直都觉得正则表达式很方便,各种字符串操作都优先使用正则,无意之间看到网上讨论正则效率,于是自己测试了一下,发现正则在确实比较容易理解,bug也少。

  但是在效率上确实不如字符操作,而且正则写法的不同对效率的影响也十分巨大,如果要使用正则,应该尽量优化正则表达式

  下面是测试用例。如有不合理的地方欢迎指出

public class RegAndChar {
    static long startTime;
    static long endTime;

    static {
        startTime = System.currentTimeMillis();
    }

    public static void main(String[] args) {
        for(int i=0;i<1000000;i++) {
            //此程序使用内存为:12963kb
            //此程序使用时间为:3186毫秒
            /*useReg("AB CDE FG", "AB");
            useReg("AB CDE FG", "CDE");
            useReg("AB CDE FG", "CD");*/

            //此程序使用内存为:193561kb
            //此程序使用时间为:601毫秒
            /*useSplit("AB CDE FG", "AB");
            useSplit("AB CDE FG", "CDE");
            useSplit("AB CDE FG", "CD");*/

            //此程序使用内存为:665kb
            //此程序使用时间为:30毫秒
            /*useSpring("AB CDE FG", "AB");
            useSpring("AB CDE FG", "CDE");
            useSpring("AB CDE FG", "CD");*/

            //此程序使用内存为:57818kb
            //此程序使用时间为:110毫秒
            /*useChar("AB CDE FG", "AB");
            useChar("AB CDE FG", "CDE");
            useChar("AB CDE FG", "CD");*/

        }

        /*--------------------------------------------------------------*/
        test();
    }

    public static boolean useReg(String s1,String s2) {
         return Pattern.compile("(.* )*" + s2 + "( .*)*").matcher(s1).matches();
    }

    public static boolean useSplit(String s1,String s2) {
        for(String s:s1.split(" ")) {
            if(s.equals(s2)) {
                return true;
            }
        }
        return false;
    }

    public static boolean useChar(String s1,String s2) {
         char[] char1 = s1.toCharArray();
         char[] char2 = s2.toCharArray();
         for(int i=0;i<char1.length;i++) {
             int j=0;
             for(;j<char2.length;j++) {
                 if(char1[i+j] != char2[j]) {
                     break;
                 }
             }
             if(j == char2.length
                     && (i+j >= char1.length || char1[i+j] == ‘ ‘)
                     && (i-1 <0 || char1[i-1] == ‘ ‘)) {
                 return true;
             }

         }
         return false;
    }

    public static boolean useSpring(String s1,String s2) {
        int length1 = s1.length();
        int length2 = s2.length();
        int limit = length1 - length2;
        char last = ‘ ‘;
        for (int i = 0; i <= limit; i++) {
          if (last == ‘ ‘ // 左
              && (i == limit || s1.charAt(i + length2) == ‘ ‘) // 右
              && s1.regionMatches(i, s2, 0, length2)) {
            return true;
          }
          last = s1.charAt(i);
        }
        return false;
    }

    public static void test() {
        endTime = System.currentTimeMillis();
        long usedTime = endTime - startTime;
        long usedMemory = (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/1024;
        System.out.println("此程序使用内存为:" + usedMemory + "kb");
        System.out.println("此程序使用时间为:" + usedTime + "毫秒");
    }
}
时间: 2024-08-27 15:02:18

正则表达式与字符操作的效率比较的相关文章

正则表达式的字符含义

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的. 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. 3.1 普通字符 由所有那些未显式指定为元字符的

正则表达式所有字符解释

在下载平台使用中往往需要较精确的正则表达式去匹配,下面对正则表达式所有字符具体解释 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后 引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个 换行符.序列 '\\' 匹配 "\" 而 "\(" 则匹配 "(". ^ 匹配输入字符串的开始位置.如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的

C语言-字符操作函数

1字符数组的初始化: 1.1 char string={'c','h','i','n','a'} 1.2char string={"china"}或者去掉{}即char string=“china" 1.3 strcpy(string,"china") 2字符串长度:字符串长度函数strlen(char string)=字符的个数+1(结束符"\0") 3输入与输出:printf("\s",string) scanf

SQL_字符操作函数

原创作品.出自 "深蓝的blog" 博客.欢迎转载,转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/40213181 思维导图: 用简单的样例演示,例如以下列举.用最简单的操作体会字符操作函数的使用方法: concat函数 SQL> select ename,job,concat(ename,job) from emp; ENAME JOB CONCAT(ENAM

正则表达式的四大操作(匹配,切割,替换,获取)

这里只介绍js中对正则表达式的相关操作,关于正则表达式的详细介绍,请参考http://manual.phpv.net/regular_expression.html 一.js中正则表达式操作 1.定义正则表达式 1)定义正则表达式有两种形式,一种是普通方式,一种是构造函数方式.2)普通方式:var reg=/表达式/附加参数 附加参数:用来扩展表达式的含义,目前主要有三个参数:g:代表可以进行全局匹配.i:代表不区分大小写匹配.m:代表可以进行多行匹配. 例子:var reg=/a*b/;var

C#——字符操作

题目要求:用户随机输入字母及数字组成的字符串,当用户连续输入字符串‘hello’时,程序结束用户输入,并分别显示用户输入的字母及数字的数目. 代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 字符操作 { public class Program { public static void Main() { char s = '#'; int Let

使用内部变量,删除,替换,UNSET,等字符操作

使用内部变量,删除,替换,UNSET,等字符操作 FREDDY=freddy 删除字符串前几2个字符: [[email protected] tmp]# echo ${FREDDY:2} eddy 从第2个开始取,取2个字符: [[email protected] tmp]# echo ${FREDDY:2:2} ed 方法二: [[email protected] tmp]# echo $FREDDY | cut -c 3-5 edd 指定要删除的字符: [[email protected] 

C# -- 正则表达式匹配字符之含义

原文:C# -- 正则表达式匹配字符之含义 C#正则表达式匹配字符之含义 1.正则表达式的作用:用来描述字符串的特征. 2.各个匹配字符的含义: .   :表示除\n以外的单个字符 [ ]  :表示在字符数组[]中罗列出来的字符任意取单个 |   :表示"或"的意思 ()  :表示改变优先级或"提取组" *   :限定前面的表达式出现0次或多次 +   :限定前面的表达式出现1次或多次 ?  :限定前面的表达式出现0次或1次 ^   :表示以表达式开头(例:^htt

Java正则表达式提取字符

需求:提取车牌号中最后一个数字,如:宁A7865提取5,宁A876X提取6 实现方法: import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { String s = "A876X"; // 把要匹配的字符串写成正则表达式,然后要提取的字符使用括号括起来 // 在这里,我们要提取最后一个数字,正则