出于性能原因,预编译正则表达式中的 Java String.split 传递

2022-09-02 00:46:24

正如给定以下代码的问题所述:

public class Foo
{
   public static void main(String[] args)
   {  
         String test = "Cats go meow";  
         String[] tokens = test.split(" ");
   }
}

是否可以按照以下方式在拆分函数中预编译该正则表达式:

public class Foo
{  
   Pattern pattern = Pattern.compile(" ");
   public static void main(String[] args)
   {  
         String test = "Cats go meow";  
         String[] tokens = test.split(pattern);
   }
}

答案 1

是的,这是可能的。此外,使静态化,以便静态方法可以访问它。patternmain

public class Foo
{  
   private static Pattern pattern = Pattern.compile(" ");
   public static void main(String[] args)
   {  
         String test = "Cats go meow";  
         String[] tokens = pattern.split(test);
   }
}

根据 String 中方法的文档,您可以使用 String 或 Pattern 的 ,但 String 编译 a 并调用其方法,因此用于预编译正则表达式。splitsplitsplitsplitPatternsplitPattern


答案 2

不 - 我认为这将是一个坏主意!

仔细查看拆分方法的源代码 - 如果字符串只有一个字符(并且不包含正则表达式特殊字符),则有一个实现的快捷方式

public String[] split(String regex, int limit) {
    /* fastpath if the regex is a
     (1)one-char String and this character is not one of the
        RegEx's meta characters ".$|()[{^?*+\\", or
     (2)two-char String and the first char is the backslash and
        the second is not the ascii digit or ascii letter.
     */
    char ch = 0;
    if (((regex.value.length == 1 &&
         ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ||

所以 - split(“ ”) 应该快得多。

另一方面,当使用正则表达式时,使它们成为静态最终成员总是一个好主意。

编辑:

String.split 的源代码 JDK1.7 和 OpenJDK 7 似乎完全相同 - 请自己看看:第 2312ff 行。

因此 - 对于更复杂的模式(例如 1 个或更多空格):

   static final Pattern pSpaces = Pattern.compile("[ ]+");