diff --git a/src/share/classes/java/util/regex/Matcher.java b/src/share/classes/java/util/regex/Matcher.java index d654790b24c7a2a9e4f8b09f3d511ab31194260a..5e437e6e8be9d6b908936778076a7134f622c21f 100644 --- a/src/share/classes/java/util/regex/Matcher.java +++ b/src/share/classes/java/util/regex/Matcher.java @@ -759,16 +759,19 @@ public final class Matcher implements MatchResult { char nextChar = replacement.charAt(cursor); if (nextChar == '\\') { cursor++; + if (cursor == replacement.length()) + throw new IllegalArgumentException( + "character to be escaped is missing"); nextChar = replacement.charAt(cursor); result.append(nextChar); cursor++; } else if (nextChar == '$') { // Skip past $ cursor++; - // A StringIndexOutOfBoundsException is thrown if - // this "$" is the last character in replacement - // string in current implementation, a IAE might be - // more appropriate. + // Throw IAE if this "$" is the last character in replacement + if (cursor == replacement.length()) + throw new IllegalArgumentException( + "Illegal group reference: group index is missing"); nextChar = replacement.charAt(cursor); int refNum = -1; if (nextChar == '{') { diff --git a/test/java/util/regex/RegExTest.java b/test/java/util/regex/RegExTest.java index 159e9afddd92830132035c2ec03387269a4e5649..f583769ecb274a75026b0d6901a18dcfeca45631 100644 --- a/test/java/util/regex/RegExTest.java +++ b/test/java/util/regex/RegExTest.java @@ -33,6 +33,7 @@ * 5013885 5003322 4988891 5098443 5110268 6173522 4829857 5027748 6376940 * 6358731 6178785 6284152 6231989 6497148 6486934 6233084 6504326 6635133 * 6350801 6676425 6878475 6919132 6931676 6948903 6990617 7014645 7039066 + * 7067045 */ import java.util.regex.*; @@ -852,6 +853,17 @@ public class RegExTest { if (!result.equals(toSupplementaries("zzz\\t$\\$zzz"))) failCount++; + // IAE should be thrown if backslash or '$' is the last character + // in replacement string + try { + "\uac00".replaceAll("\uac00", "$"); + "\uac00".replaceAll("\uac00", "\\"); + failCount++; + } catch (IllegalArgumentException iie) { + } catch (Exception e) { + failCount++; + } + report("Literal replacement"); }