[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