Bug bizarre dans java.util.regexp
Je crois que j'ai trouvé un bug bizarre les expressions régulières.
Normalement, les expressions suivantes devraient donner les mêmes résultats:
Z?x{2,}|C
(?:Z){0,1}x{2,}|C
(?:Z)?x{2,}|C
(En français, un Z optionnel suivi d'au moins 2 "x", ou bien un grand C.
Et bien, c'est vrai sous le JDK 1.5, mais avec le JDK 1.6.0_12-b04 sous Windows, la dernière expression n'est pas équivalente aux autres!!
Y'a un pro des regexp pour me dire si c'est mes yeux? 8O
Un petit TestCase pour prouver ça: j'analyse la chaine "xxC", qui devrait donner "xx" puis "C"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
public class PatternBugTest extends TestCase {
private void check(String s) {
final Pattern p = Pattern.compile(s);
final Matcher m = p.matcher("xxC");
final List<String> result = new ArrayList<String>();
while (m.find()) {
result.add(m.group(0));
}
assertEquals(Arrays.asList("xx", "C"), result);
}
public void testBugKO() {
check("Z?x{2,}|C"); //Ok
check("(?:Z){0,1}x{2,}|C"); //Ok
check("(?:Z)?x{2,}|C"); //bug on JDK 1.6.0_12-b04
}
} |