package org.ireland.util;
import java.util.regex.Pattern;
import org.junit.Test;
import com.caucho.util.CharBuffer;
public class RegExpBench
{
private static Pattern urlPatternToRegexp(String pattern, int flags)
{
if (pattern.length() == 0 || pattern.length() == 1 && pattern.charAt(0) == '/')
{
try
{
return Pattern.compile("^/$", flags);
}
catch (Exception e)
{
}
}
int length = pattern.length();
boolean isExact = true;
if (pattern.charAt(0) != '/' && pattern.charAt(0) != '*')
{
pattern = "/" + pattern;
length++;
}
int prefixLength = -1;
boolean isShort = false;
CharBuffer cb = new CharBuffer();
cb.append("^");
for (int i = 0; i < length; i++)
{
char ch = pattern.charAt(i);
if (ch == '*' && i + 1 == length && i > 0)
{
isExact = false;
if (pattern.charAt(i - 1) == '/')
{
cb.setLength(cb.length() - 1);
if (prefixLength < 0)
prefixLength = i - 1;
}
else if (prefixLength < 0)
prefixLength = i;
if (prefixLength == 0)
prefixLength = 1;
}
else if (ch == '*')
{
isExact = false;
cb.append(".*");
if (prefixLength < 0)
prefixLength = i;
if (i == 0)
isShort = true;
}
else if (ch == '.' || ch == '[' || ch == '^' || ch == '$' || ch == '{' || ch == '}' || ch == '|' || ch == '(' || ch == ')' || ch == '?')
{
cb.append('\\');
cb.append(ch);
}
else
cb.append(ch);
}
if (isExact)
cb.append('$');
else
cb.append("(?=/)|" + cb.toString() + "$");
try
{
return Pattern.compile(cb.close(), flags);
}
catch (Exception e)
{
return null;
}
}
private static Pattern pattern = urlPatternToRegexp("/page/*",Pattern.CASE_INSENSITIVE);
private static Pattern pattern2 = urlPatternToRegexp("/*",Pattern.CASE_INSENSITIVE);
private static Pattern pattern3 = urlPatternToRegexp("/myspace",Pattern.CASE_INSENSITIVE);
private static Pattern pattern4 = urlPatternToRegexp("*.jsp",Pattern.CASE_INSENSITIVE);
private static Pattern pattern5 = urlPatternToRegexp("/",Pattern.CASE_INSENSITIVE);
@Test//16.547S
public void RegBench()
{
boolean b ;
String uri = "/page/123";
String uri2 = "/page/*";
String uri3 = "/pdfskl";
String uri4 = "/myapp/page/65";
String uri5 = "/myspace";
String uri6 = "/myspace?username=jack";
String uri7 = "/home.jsp";
for(int i=0; i<5000000; i++)
{
b = pattern.matcher(uri).find();
b = pattern.matcher(uri2).find();
b = pattern.matcher(uri3).find();
b = pattern.matcher(uri4).find();
b = pattern.matcher(uri5).find();
b = pattern.matcher(uri6).find();
b = pattern.matcher(uri7).find();
b = pattern2.matcher(uri).find();
b = pattern2.matcher(uri2).find();
b = pattern2.matcher(uri3).find();
b = pattern2.matcher(uri4).find();
b = pattern2.matcher(uri5).find();
b = pattern2.matcher(uri6).find();
b = pattern2.matcher(uri7).find();
b = pattern3.matcher(uri).find();
b = pattern3.matcher(uri2).find();
b = pattern3.matcher(uri3).find();
b = pattern3.matcher(uri4).find();
b = pattern3.matcher(uri5).find();
b = pattern3.matcher(uri6).find();
b = pattern3.matcher(uri7).find();
b = pattern4.matcher(uri).find();
b = pattern4.matcher(uri2).find();
b = pattern4.matcher(uri3).find();
b = pattern4.matcher(uri4).find();
b = pattern4.matcher(uri5).find();
b = pattern4.matcher(uri6).find();
b = pattern4.matcher(uri7).find();
}
}
@Test
// 1.083S
public void RegBench2()
{
boolean b;
String uri = "/page/123";
b = pattern5.matcher(uri).find();
}
}