[Java lista] Pattern.compile bug (jdk 1.5) -- meglepo vegkifejlet
Marai Laszlo
lists at atleta.hu
2008. Már. 5., Sze, 02:37:05 CET
On Tue, 4 Mar 2008 21:52:59 +0100
"Andras Dobrosi" <andris at freemail.hu> wrote:
Hali!
> ui: Amúgy megnéztem a forrást és az 1.6-os tényleg nem natív, sőt
> kicsit látszik is rajta, hogy emberek írták.
Egyik sem az (1.4, 1.5, 1.6). Viszont egesz meglepo, kicsit happy endbe
hajlo vegkifejlete lett a dolognak. Ha a patternekben a kerdojeleket (?)
{0,1}-re cserelem - ami ugye pont ugyanazt jelenti - akkor szepen mukodik
1.5 es 1.4 alatt is. Tehat pl. az egeszeket leiro regex errol
"([+\\-]?[0-9]+)?" erre "([+\\-]{0,1}[0-9]+){0,1}" valtozik. Asszem erre
megis csak mondhatjuk, hogy bug :).
Aki nem hiszi, jarjon utana:
-------------------->8--------------------------
import java.util.regex.Pattern;
import java.util.*;
import java.util.regex.Matcher;
public class RegexBug {
private static final String SLOW = "([0-9]+)?";
private static final String FAST = "([0-9]+){0,1}";
public static void main( String args[] ) throws Exception {
//"(?:\"((?:.|(?:\\\")){0,10})\")?,([0-9]{4}/[0-9]{2}/[0-9]{2})?,
int count = Integer.parseInt( args[0] );
test( FAST, count );
test( SLOW, count );
}
private static void test( String pattern, int count ) {
StringBuffer buff = new StringBuffer();
StringBuffer data = new StringBuffer();
for ( int i = 0; i < count - 1; i++ ) {
buff.append( pattern ).append( ',' );
data.append( "837291," );
}
buff.append( pattern );
data.append( "837291" );
long s0 = System.currentTimeMillis();
Pattern p = Pattern.compile( buff.toString() );
long s1 = System.currentTimeMillis();
Matcher m = p.matcher( buff.toString() );
boolean matches = p.matcher( data.toString() ).matches();
long s2 = System.currentTimeMillis();
System.out.println( "Pattern = " + pattern + "\n matches: " + matches );
System.out.println(" compile: " + (s1-s0) + "ms\n match " + (s2-s1) + "ms" ); }
}
-------------------------8<------------------------------
Hivasnal a parancssorban egy szamot var parameterkent, ennyiszer fogja
egymas melle masolni a SLOW ill. a FAST patternt. Nalam pl. 25-tel
3ms es 2570ms az eredmeny. 30 fole nem erdemes menni :).
atleta
További információk a(z) Javalist levelezőlistáról