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のメソッドのドキュメントによると、 StringまたはPatternsplitを使用できますが、Stringはをコンパイルしてそのメソッドを呼び出すため、を使用して正規表現をプリコンパイルします。splitsplitsplitPatternsplitPattern

于 2013-02-15T19:06:13.263 に答える
7

いいえ-それは悪い考えだと思います!

split-methodのソースコードを詳しく見る-文字列が1文字のみの場合(正規表現の特殊文字が含まれていない場合)に実装されたショートカットがあります

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( "")の方がはるかに高速です。

一方、正規表現を使用する場合は、静的な最終メンバーにすることをお勧めします。

編集:

ソースコードJDK1.7とOpenJDK7は、String.splitと同じように見えます-自分で見てください: 行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 に答える