diff --git a/src/main/java/org/apache/commons/text/io/StringSubstitutorReader.java b/src/main/java/org/apache/commons/text/io/StringSubstitutorReader.java index 3b237c9805..1ba5add11a 100644 --- a/src/main/java/org/apache/commons/text/io/StringSubstitutorReader.java +++ b/src/main/java/org/apache/commons/text/io/StringSubstitutorReader.java @@ -273,7 +273,7 @@ public int read(final char[] target, final int targetIndexIn, final int targetLe while (true) { if (isBufferMatchAt(suffixMatcher, pos)) { balance--; - pos++; + pos += suffixMatcher.size(); if (balance == 0) { break; } diff --git a/src/test/java/org/apache/commons/text/io/StringSubstitutorFilterReaderTest.java b/src/test/java/org/apache/commons/text/io/StringSubstitutorFilterReaderTest.java index 287d423439..39f5623e65 100644 --- a/src/test/java/org/apache/commons/text/io/StringSubstitutorFilterReaderTest.java +++ b/src/test/java/org/apache/commons/text/io/StringSubstitutorFilterReaderTest.java @@ -240,6 +240,22 @@ void testReadMixedBufferLengthsVarLenPlusToNoReplace() throws IOException { } } + @Test + void testReadSubstituteVariablesWithSuffixLongerThanTwoCharacters() throws IOException { + final StringSubstitutor substitutor = new StringSubstitutor(values); + final String template = "[[aaa]]>"; + substitutor.setVariablePrefix("[["); + substitutor.setVariableSuffix("]]>"); + + try (Reader reader = createReader(substitutor, template)) { + final int endIndex = template.length() - 1; + final char[] cbuf = new char[endIndex]; + final int readCount = reader.read(cbuf); + final String result = new String(cbuf, 0, readCount); + assertEquals("111", result); + } + } + private Reader toReader(final String expectedResult) { return expectedResult != null ? new StringReader(expectedResult) : new NullReader(); }