diff --git a/java/com/google/re2j/Matcher.java b/java/com/google/re2j/Matcher.java index 678186d0..e5c6d445 100644 --- a/java/com/google/re2j/Matcher.java +++ b/java/com/google/re2j/Matcher.java @@ -504,7 +504,7 @@ private void appendReplacementInternal(StringBuilder sb, String replacement) { } for (i += 2; i < m; i++) { c = replacement.charAt(i); - if (c < '0' || c > '9' || n * 10 + c - '0' > groupCount) { + if (c < '0' || c > '9') { break; } n = n * 10 + c - '0'; diff --git a/javatests/com/google/re2j/MatcherTest.java b/javatests/com/google/re2j/MatcherTest.java index 4f24ae2e..55fcd334 100644 --- a/javatests/com/google/re2j/MatcherTest.java +++ b/javatests/com/google/re2j/MatcherTest.java @@ -54,7 +54,7 @@ public void testReplaceAll() { ApiTestUtils.testReplaceAll( "abcdefghijklmnopqrstuvwxyz123", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", - "$10$20", + "$10$2\\0", "jb0wo0123"); ApiTestUtils.testReplaceAll( "\u00e1\u0062\u00e7\u2655", "(.)", "<$1>", "<\u00e1><\u0062><\u00e7><\u2655>"); @@ -83,7 +83,7 @@ public void testReplaceFirst() { ApiTestUtils.testReplaceFirst( "abcdefghijklmnopqrstuvwxyz123", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", - "$10$20", + "$10$2\\0", "jb0nopqrstuvwxyz123"); ApiTestUtils.testReplaceFirst( "\u00e1\u0062\u00e7\u2655", "(.)", "<$1>", "<\u00e1>\u0062\u00e7\u2655"); @@ -166,6 +166,22 @@ public void testInvalidReplacement() { } } + @Test + public void testInvalidReplacementDoubleDigit() { + try { + ApiTestUtils.testReplaceFirst("abc", "(abc)", "$10", "xxx"); + fail(); + } catch (IndexOutOfBoundsException e) { + /* ok */ + assertTrue(true); + } + } + + @Test + public void testValidReplacementSingleDigitSeparated() { + ApiTestUtils.testReplaceFirst("abc", "(abc)", "$1\\0", "abc0"); + } + @Test public void testInvalidGroupNoMatch() { try {