java - 将 String.endsWith(..) 与正则表达式等效项进行比较

标签 java regex string compare

我们有一个应用程序,我们需要过滤某些类型的文件。我们认为正则表达式方式会比简单的 Strings.endsWith() 更快方法。但为了验证这个假设,我们做了一个小型基准测试。以下是我们使用的工作代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test{

       private static Pattern pattern;
       private static Matcher matcher;   
       private static final String IMAGE_PATTERN = "([^\\s]+(\\.(?i)(jpeg|jpg|png|gif|bmp|css|js))$)";

       private static String[] files = {"jpeg","jpg","png","gif","bmp","css","js"};

    public static void main(String args[]) throws Exception {   

        pattern = Pattern.compile(IMAGE_PATTERN);

        //Input Strings
        String input = args[0];
        String[] inputArr = input.split(",");

        Integer iterations = 10000;
        Integer i = 0;

        Long t1 = System.currentTimeMillis();

        while(i < iterations){

            for (int j = 0; j < inputArr.length; j++) {
                validateReg(inputArr[j]);
            }   
            i++;
        }       
        System.out.println("Time taken using regex:"+(System.currentTimeMillis() - t1));

        t1 = System.currentTimeMillis();
        i=0;
        while(i < iterations){

            for (int j = 0; j < inputArr.length; j++) {
                validateStr(inputArr[j]);
            }
            i++;
        }
        System.out.println("Time taken using .endsWith :"+(System.currentTimeMillis() - t1));

    } 

      public static boolean validateReg(final String file){

          matcher = pattern.matcher(file);
          return matcher.matches();

       }

      public static boolean validateStr(final String file){

          for (int i = 0; i < files.length; i++) {

              if(file.endsWith(files[i])){
                  return true;
              }
        }
            return false;
       }      
 }

对于输入abc.jpg,efg.css,jij.jpeg,test.java,best.css,not.gif,f.exe,test.js,su.css,not.js,yes ,png

打印:

Time taken using regex:89
Time taken using .endsWith :6

并且多次运行的数字相当相同。即使更改 while 循环的执行顺序,结果也是相同的。看起来 String.endsWith() 比它的正则表达式要快得多。

现在我的问题是:,这种基准测试方法得出的结论是否正确?或者有没有更好、更可信的方法来测试这个场景?

最佳答案

我发现 endsWith 速度更快。我怀疑是否需要进行大量测试才能得出结论。

普通字符串搜索方法通常比正则表达式更快(不仅仅是在 Java 中)。

关于java - 将 String.endsWith(..) 与正则表达式等效项进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21625223/

相关文章:

mysql - SQL公式仅在一条语句中以任何顺序匹配所有单词

python - python中不区分大小写的字符串类

c++ - 您将如何处理字符串通配符,而不仅仅是比较正确的值?

java - 发现没有@Transaction的方法?

java - RP 发起注销中的“id_token_hint”

regex - VBA Excel正则表达式-如果单词在字符串的开头,\b单词边界不匹配

regex - java 8 中的 Pattern.matcher 不匹配节号 §

java - 访问在不同浏览器窗口中运行的 Applet

java - 如何从docker容器中的InetAddress.getLocalHost().getHostName()返回 "localhost"

java - Struts2 中 getContextMap() 和 getValueStack() 之间的区别?