Index: regex/src/test/java/org/apache/harmony/tests/java/util/regex/PatternTest.java =================================================================== --- regex/src/test/java/org/apache/harmony/tests/java/util/regex/PatternTest.java (revision 475869) +++ regex/src/test/java/org/apache/harmony/tests/java/util/regex/PatternTest.java (working copy) @@ -34,8 +34,12 @@ + "i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)*(1|2|3|4|5|6|7|8|9|0)*|while|for|struct|if|do", "x(?c)y", "x(?cc)y", - "x(?:c)y" - + "x(?:c)y", + "x?y", + "x??yz", + "x{2,4}?yz", + "x{2,4}yz", + "x{2,4}+yz" }; /** @@ -365,6 +369,11 @@ */ pattern = "(b\\1)a"; Pattern.compile(pattern); + + Pattern.compile("a?bc"); + Pattern.compile("a??bc"); + Pattern.compile("a{2,4}?bc"); + Pattern.compile("a?+bc"); } @@ -420,7 +429,12 @@ { "a123", "bnxnvgds156", "for", "while", "if", "struct" }, { "xy" }, { "xy" }, - { "xcy" } + { "xcy" }, + { "y", "xy" }, + { "yz" }, + { "xxxxyz", "xxyz" }, + { "xxxxyz"}, + { "xxxxyz"} }; @@ -431,6 +445,12 @@ posSeq[i][j])); } } + + // test for false positives + assertFalse(Pattern.matches("x?y", "xxy")); + assertFalse(Pattern.matches("x?y", "xyy")); + assertFalse(Pattern.matches("x??yz", "xxyz")); + assertFalse(Pattern.matches("x?+yz", "xxyz")); } public void testTimeZoneIssue() { Index: regex/src/main/java/java/util/regex/Pattern.java =================================================================== --- regex/src/main/java/java/util/regex/Pattern.java (revision 475758) +++ regex/src/main/java/java/util/regex/Pattern.java (working copy) @@ -610,6 +610,7 @@ // //// && !(cur instanceof CompositeQuantifierSet) && !(cur instanceof GroupQuantifierSet) + && !(cur instanceof AltQuantifierSet) && !next.first(((LeafQuantifierSet) cur).getInnerSet())) { cur = new UnifiedQuantifierSet((LeafQuantifierSet) cur); } Index: regex/src/main/java/java/util/regex/ReluctantCompositeQuantifierSet.java =================================================================== --- regex/src/main/java/java/util/regex/ReluctantCompositeQuantifierSet.java (revision 475758) +++ regex/src/main/java/java/util/regex/ReluctantCompositeQuantifierSet.java (working copy) @@ -66,7 +66,7 @@ i++; } - } while (shift >= 1 && i < max); + } while (shift >= 1 && i <= max); return -1; }