[Java lista] Pattern.compile bug (jdk 1.5) -- meglepo vegkifejlet
Andras Dobrosi
andris at freemail.hu
2008. Már. 5., Sze, 11:02:46 CET
Hatha valaki kiszur vmit:
/**
* Processes repetition. If the next character peeked is a quantifier
* then new nodes must be appended to handle the repetition.
* Prev could be a single or a group, so it could be a chain of nodes.
*/
private Node closure(Node prev) {
Node atom;
int ch = peek();
switch (ch) {
case '?':
ch = next();
if (ch == '?') {
next();
return new Ques(prev, LAZY);
} else if (ch == '+') {
next();
return new Ques(prev, POSSESSIVE);
}
return new Ques(prev, GREEDY);
case '*':
ch = next();
if (ch == '?') {
next();
return new Curly(prev, 0, MAX_REPS, LAZY);
} else if (ch == '+') {
next();
return new Curly(prev, 0, MAX_REPS, POSSESSIVE);
}
return new Curly(prev, 0, MAX_REPS, GREEDY);
case '+':
ch = next();
if (ch == '?') {
next();
return new Curly(prev, 1, MAX_REPS, LAZY);
} else if (ch == '+') {
next();
return new Curly(prev, 1, MAX_REPS, POSSESSIVE);
}
return new Curly(prev, 1, MAX_REPS, GREEDY);
case '{':
ch = temp[cursor+1];
if (ASCII.isDigit(ch)) {
skip();
int cmin = 0;
do {
cmin = cmin * 10 + (ch - '0');
} while (ASCII.isDigit(ch = read()));
int cmax = cmin;
if (ch == ',') {
ch = read();
cmax = MAX_REPS;
if (ch != '}') {
cmax = 0;
while (ASCII.isDigit(ch)) {
cmax = cmax * 10 + (ch - '0');
ch = read();
}
}
}
if (ch != '}')
throw error("Unclosed counted closure");
if (((cmin) | (cmax) | (cmax - cmin)) < 0)
throw error("Illegal repetition range");
Curly curly;
ch = peek();
if (ch == '?') {
next();
curly = new Curly(prev, cmin, cmax, LAZY);
} else if (ch == '+') {
next();
curly = new Curly(prev, cmin, cmax, POSSESSIVE);
} else {
curly = new Curly(prev, cmin, cmax, GREEDY);
}
return curly;
} else {
throw error("Illegal repetition");
}
default:
return prev;
}
Egyebkent pl. a case '{': agat pl. nem lehetett volna kicsit
elegansabban megoldani (nekem igy elso blikkre eleg tragyanak tunik,
biztos mar faradt volt a programozo, vagy haza akart erni a
baratokkoztre)?!
Andris
2008/3/5 Andras Dobrosi <andris at freemail.hu>:
> Hali!
>
> Akkor cseréld a + is erre {1,} ! Szerintem se bug, de én sem nem tudom
> miért lehet ez.
>
> Andris
>
> 2008/3/5 Molnár Miklós <timortinj at freemail.hu>:
>
>
> > Hali,
> >
> >
> > >Asszem erre megis csak mondhatjuk, hogy bug :).
> >
> > És biztosan nem lehet 'feature'? ;) /És a smiley ellenére azért komolyból is
> > kérdezem.../
> >
> > MM
> >
> > PS:
> > >Hat, ha arra panaszkodtam, hogy lassu, akkor te mire tippelsz? >;-)
> >
> > Azért nem volt számomra egyértelmű, mert a threadből nekem speciel az jött
> > le, hogy vagy nagyon gyors, vagy nagyon lassú a regexpelési idő.
> > Amúgy pedig bocs mindenkitől, hogy nekem mint a viccbeli Mórickának
> > mindenről _az_ jut eszébe (lásd még 'bug vagy feature' problématikát), de én
> > nem tudok elszakadni attól, hogy például a teljesen más SQL-világban, nap,
> > mint nap találkozhatunk hasonlóan optimalizásra váró rejtélyes problémákkal,
> > a márcsak a dolog természeténél is fogva. Lehet, hogy nagyon elrugaszkodok a
> > talajról, de lehet, hogy mégsem olyan trivi a regexp-feldolgozás, mint
> > elsőre gondolhatnók.
> >
> >
> > __________ Information from ESET Smart Security, version of virus signature
> > database 2922 (20080305) __________
> >
> > The message was checked by ESET Smart Security.
> >
> > http://www.eset.com
> >
> >
> >
> >
> > _______________________________________________
> > Javalist mailing list
> > Javalist at javagrund.hu
> > http://javagrund.hu/mailman/listinfo/javalist
> >
>
További információk a(z) Javalist levelezőlistáról