正規表現は、長く複雑になるほどパフォーマンスが低下します。このような場合は、入力を3つの正規表現と照合する方が、パフォーマンスが高く、理解しやすいはずです。
String match = "quxfoobar";
Pattern start = Pattern.compile("^foo");
Pattern contain = Pattern.compile("\\/foo");
Pattern end = Pattern.compile("bar$");
boolean m = (
!start.matcher(match).find() &&
!contain.matcher(match).find() &&
end.matcher(match).find()
);
編集:この場合、3つの正規表現が高速になるかどうかについて疑問があるため、ベンチマークを作成しました。私がそれを実行すると、単一の正規表現(別の回答から取得)は、3つの別々の正規表現で実行する場合の3倍遅くなります。
import java.util.regex.*;
import java.util.*;
public class Test {
private static final Pattern START = Pattern.compile("^foo");
private static final Pattern CONTAIN = Pattern.compile("\\/foo");
private static final Pattern END = Pattern.compile("bar$");
private static final Pattern ONEPATTERN = Pattern.compile("^(?!foo)(\\/(?!foo)|[^\\/])*bar$");
public static void main(String[] args){
String[] in = createInput();
timeOnePattern(in);
timeThreePatterns(in);
System.exit(0);
}
public static String[] createInput(){
String[] words = {"foo","bar","baz","biz","/foo"};
Random rand = new Random();
String[] in = new String[10000];
for (int i=0; i<in.length; i++){
StringBuilder sb = new StringBuilder();
for (int j=0; j<4; j++){
sb.append(words[rand.nextInt(words.length)]);
}
in[i] = sb.toString();
}
return in;
}
public static void timeThreePatterns(String[] in){
long startTime = System.nanoTime();
for (String s: in){
boolean b = (!START.matcher(s).find() && !CONTAIN.matcher(s).find() && END.matcher(s).find());
}
long endTime = System.nanoTime();
System.out.println("Three regular expressionv took " + (endTime - startTime) + " nanoseconds.");
}
public static void timeOnePattern(String[] in){
long startTime = System.nanoTime();
for (String s: in){
ONEPATTERN.matcher(s).matches();
}
long endTime = System.nanoTime();
System.out.println("Single regular expression took " + (endTime - startTime) + " nanoseconds.");
}
}