21

正如问题所述,给出以下代码:

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

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

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

4 回答 4

26

对的,这是可能的。另外,使pattern静态方法main可以访问它。

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中方法的文档split,您可以使用 String'ssplit或 Pattern's split,但 String'ssplit编译 aPattern并调用其split方法,因此用于Pattern预编译正则表达式。

于 2013-02-15T19:06:13.263 回答
7

不——我认为那是个坏主意!

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

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("[ ]+");
于 2013-02-15T19:16:11.193 回答
6
public class Foo
{  
   private static final Pattern pattern = Pattern.compile(" ");
   public static void main(String[] args)
   {  
         String test = "Cats go meow";  
         String[] tokens = pattern.split(test);
   }
}
于 2013-02-15T19:06:20.827 回答
4

改用Pattern.split()

String[] tokens = pattern.split(test);
于 2013-02-15T19:04:49.973 回答