Gotcha! Now I can understand the escape character means: "Ignore the following variable reference." Thank you so much for the explanation with a good solution.
Cheers, Woonsan On Thu, Jul 23, 2015 at 2:42 PM, Anthony Brice <anthonybr...@lateachiever.com> wrote: > Sorry, the second sentence in the first paragraph should read: "When you > change the default escape character, you don't need to use it _to_ get a > dollar sign before a variable reference in your interpolated string." > > To explain a little more, consider what happens to " $${amount}" when > you're using StrSubstitutor's default escape character. StrSubstitutor sees > that you've got a variable reference ("${amount}"), and that you've got the > escape character ("$") before it, so it replaces "$${amount}" with > "${amount}". > > Now consider what happens to " $${amount}" when you've set StrSubstitutor's > escape character to something other than the default. StrSubstitutor sees > the variable reference ("${amount}"), notes that the character ("$") before > the variable reference is _not_ the user-defined escape character, and so > replaces "${amount}" with the appropriate value form the map. > > Regards, > Anthony Brice > > On Thu, Jul 23, 2015 at 11:24 AM, Anthony Brice < > anthonybr...@lateachiever.com> wrote: > >> 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 >>> >>> >> --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@commons.apache.org For additional commands, e-mail: user-h...@commons.apache.org