The escape character just tells StrSubstitutor "Ignore the following variable reference." When you change the default escape character, you don't need to use it get a dollar sign before a variable reference in your interpolated string. Try the following:
@Test public void testReplaceEscapingDollarSign() { values.put("amount", "20.00"); final StrSubstitutor sub = new StrSubstitutor(values); sub.setEscapeChar('<'); String replaceTemplate = "The <${animal} jumps over the ${target}."; String expectedResult = "The ${animal} jumps over the lazy dog."; String replacedResult = sub.replace(replaceTemplate); assertEquals(expectedResult, replacedResult); replaceTemplate = "The ${animal} paid $${amount} to jump over the ${target}."; expectedResult = "The quick brown fox paid $20.00 to jump over the lazy dog."; replacedResult = sub.replace(replaceTemplate); assertEquals(expectedResult, replacedResult); } Regards, Anthony Brice On Thu, Jul 23, 2015 at 7:42 AM, Woonsan Ko <woon...@apache.org> wrote: > Sorry, the example was incomplete. It should be like this: > > @Test > public void testReplaceEscapingDollarSign() { > values.put("amount", "20.00"); > > final StrSubstitutor sub = new StrSubstitutor(values); > sub.setEscapeChar('<'); > > String replaceTemplate = "The <${animal} jumps over the > ${target}."; > String expectedResult = "The ${animal} jumps over the lazy dog."; > String replacedResult = sub.replace(replaceTemplate); > assertEquals(expectedResult, replacedResult); > > replaceTemplate = "The ${animal} paid <$${amount} to jump over > the ${target}."; > expectedResult = "The quick brown fox paid $20.00 to jump over > the lazy dog."; > replacedResult = sub.replace(replaceTemplate); > assertEquals(expectedResult, replacedResult); > } > > The second assertion failed. So, it seems working in case of > "<${animal}", but not working in case of "<$${amount}". > > > testReplaceEscapingDollarSign(org.apache.commons.lang3.text.StrSubstitutorTest) > Time elapsed: 0.009 sec <<< FAILURE! > org.junit.ComparisonFailure: expected:<...uick brown fox paid []$20.00 > to jump over ...> but was:<...uick brown fox paid [<]$20.00 to jump > over ...> > > Regards, > > Woonsan > > On Thu, Jul 23, 2015 at 10:28 AM, Woonsan Ko <woon...@apache.org> wrote: > > Hi Anthony, > > > > Putting '$20.00' into the map is not an option in my use case, so I > > tried to use a different escape character. But it doesn't seem to be > > working either (another bug?): > > > > @Test > > public void testReplaceEscapingDollarSign() { > > values.put("amount", "20.00"); > > > > final StrSubstitutor sub = new StrSubstitutor(values); > > sub.setEscapeChar('<'); > > > > String replaceTemplate = "The <${animal} jumps over the > ${target}."; > > String expectedResult = "The ${animal} jumps over the lazy dog."; > > String replacedResult = sub.replace(replaceTemplate); > > assertEquals(expectedResult, replacedResult); > > > > //... > > } > > > > It fails like this: > > > > org.junit.ComparisonFailure: expected:<...uick brown fox paid []$20.00 > > to jump over ...> but was:<...uick brown fox paid [<]$20.00 to jump > > over ...> > > at org.junit.Assert.assertEquals(Assert.java:115) > > at org.junit.Assert.assertEquals(Assert.java:144) > > at > org.apache.commons.lang3.text.StrSubstitutorTest.testReplaceEscapingDollarSign(StrSubstitutorTest.java:182) > > > > I think I'd better file a bug regard to escape character handling. > > > > Regards, > > > > Woonsan > > > > > > > > On Wed, Jul 22, 2015 at 9:12 PM, Anthony Brice > > <anthonybr...@lateachiever.com> wrote: > >> It's not a bug---that's a feature! :p > >> > >> From the javadoc: "If this character ['$'] is placed before a variable > >> reference, this reference is ignored and won't be replaced." So even > when > >> you use three dollar signs, you still have a variable reference > >> ("${amount}") with the escape character placed before it, thus the > variable > >> reference will not be replaced. > >> > >> To achieve your desired effect, I think you either have to put the > dollar > >> sign in the mapping (e.g., "values.put("amount", "$20.00"), use > different > >> delimiters, or just set a different escape character. > >> > >> Regards, > >> Anthony Brice > >> > >> On Wed, Jul 22, 2015 at 2:50 PM, Woonsan Ko <woon...@apache.org> wrote: > >> > >>> Hi there, > >>> > >>> I tried to use the following, expecting "...ick brown fox paid $20.00 > >>> to jump over the la…": > >>> > >>> // In org.apache.commons.lang3.text.StrSubstitutorTest.java locally > >>> // after cloning https://github.com/woonsan/commons-lang. > >>> @Test > >>> public void testReplaceEscapingDollarSign() { > >>> values.put("amount", "20.00"); > >>> doTestReplace("The quick brown fox paid $20.00 to jump over > >>> the lazy dog.", > >>> "The ${animal} paid $$${amount} to jump over the > >>> ${target}.", true); > >>> } > >>> > >>> (I put double dollar signs like $$${amount} because $ is the default > >>> escape character.) > >>> > >>> But, the result was:"...ick brown fox paid $${amount} to jump over the > >>> la…". > >>> > >>> Is it a bug or did I miss something? > >>> > >>> Regards, > >>> > >>> Woonsan > >>> > >>> --------------------------------------------------------------------- > >>> To unsubscribe, e-mail: user-unsubscr...@commons.apache.org > >>> For additional commands, e-mail: user-h...@commons.apache.org > >>> > >>> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@commons.apache.org > For additional commands, e-mail: user-h...@commons.apache.org > >